0

我正在使用 MvvmCross 框架来交付使用 Xamarin 的跨平台应用程序。我的 Windows Phone 应用程序在 WP8 平台下完全可以正常工作,在 WP7 平台下失败并出现内部错误。我正在为 WP7 和 WP8 平台使用单个 Visual Studio 项目(WP7 模板)。

var setup = new Setup(RootFrame);
setup.Initialize();

这里是详细的堆栈跟踪:

System.InvalidProgramException was unhandled
  Message=InvalidProgramException
  StackTrace:
       at System.RuntimeType.GetConstructors(BindingFlags bindingAttr)
       at Cirrious.CrossCore.IoC.MvxTypeExtensions.<CreatableTypes>b__1(Type t)
       at System.Linq.Enumerable.<WhereIterator>d__0`1.MoveNext()
       at System.Linq.Enumerable.<WhereIterator>d__0`1.MoveNext()
       at Cirrious.CrossCore.Platform.MvxBootstrapRunner.Run(Assembly assembly)
       at Cirrious.MvvmCross.Platform.MvxSetup.PerformBootstrapActions()
       at Cirrious.MvvmCross.Platform.MvxSetup.InitializeSecondary()
       at Cirrious.MvvmCross.Platform.MvxSetup.Initialize()
       at MyApp.WP.App..ctor()
       at System.Reflection.RuntimeConstructorInfo.InternalInvoke(RuntimeConstructorInfo rtci, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
       at System.Reflection.RuntimeConstructorInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
       at System.Reflection.ConstructorInfo.Invoke(Object[] parameters)
       at MS.Internal.TypeProxy.<>c__DisplayClass30.<GetCreateObjectDelegate>b__2a()
       at MS.Internal.TypeProxy.CreateInstance(UInt32 customTypeId)
       at MS.Internal.FrameworkCallbacks.CreateKnownObject(IntPtr nativeRootPeer, UInt32 customTypeId, String initializationString, IntPtr& nativePeer, UInt32 isCreatedByParser)
       at MS.Internal.FrameworkCallbacks.CreateUnknownObject(String assemblyName, String typeName, IntPtr nativeRootPeer, String initializationString, UInt32& customTypeId, UInt32& coreTypeId, UInt32& typeFlags, IntPtr& nativePeer)

任何想法如何诊断和解决问题?

4

1 回答 1

1

任何想法如何诊断和解决问题?

Cirrious.CrossCore.Platform.MvxBootstrapRunner.Run调用正在查看您的主程序集并寻找要运行的引导类。

异常发生在该扫描期间。

您应该能够通过打开“异常中断”来获得有关异常的更多信息InvalidProgramException

如果做不到这一点,您还可以使用修改后的CreatableTypes调用在您自己的代码中导致异常 - 即在您的Setup代码覆盖中PerformBootstrapActions并尝试调用:

    var things = MyCreatableTypes(this.GetType().Assembly).ToList();

和:

    public IEnumerable<Type> MyCreatableTypes(Assembly assembly)
    {
        return assembly
            .ExceptionSafeGetTypes()
            .Where(t => !t.IsAbstract)
            .Where(t => {
                try
                {
                    Mvx.Trace("About to call GetConstructors for Type {0}", t.Name);
                    return t.GetConstructors(BindingFlags.Instance | BindingFlags.Public).Any()
                }
                catch (InvalidProgramException e)
                {
                    // your trace or debugging code...
                    return false;
                });
    }

这将有希望帮助您诊断失败的原因......然后修复将有望随之而来。


旁白:另请注意,MvvmCross(及更高版本)的 v3.1 将不支持 WP7,因为 Microsoft 仅授权更新的 PCL 库以供跨平台使用 - 请参阅http://slodge.blogspot.co.uk/2013/07/ mvvmcross-wp7-tombstoned.html。v3.0.14 是对 WP7 的最后一个官方 MvvmCross 支持

于 2014-01-29T06:11:27.770 回答