启动MvvmCross Uwp应用程序时出现异常:" System.AccessViolationException:尝试读取或写入受保护的内存"

时间:2015-10-11 11:36:36

标签: c# mvvmcross uwp

我正在尝试使用MvvmCross创建一个Windows Universal App,其中包含最新的UWP位(RTM)。在App.xaml.cs中,当我尝试运行时 -

var start = Mvx.Resolve<IMvxAppStart>();
start.Start();

我得到了一个&#34; System.AccessViolationException&#34; -

Message: "Attempted to read or write protected memory. This is often an indication that other memory is corrupt"

我创建了一个示例项目来重现问题,它包含 -

  • 可移植类库(Test.NewCore),其目标是&#34; .NET Framework 4.6&#34;和&#34; Windows 10&#34;。
  • A&#34;通用Windows&#34; app(Test.Uwp),目标是&#34; Windows 10(10.0; Build 10240)&#34;
  • 我正在使用最新的nuget预发布软件包,&#34; MvvmCross 4.0.0-beta3&#34;而且我相信我的设置正确(我在这里查看了示例:https://github.com/MvvmCross/MvvmCross/tree/4.0/nuspec

您可以在此处下载测试项目:http://1drv.ms/1G6w2m3

完整的堆栈跟踪低于 -

System.AccessViolationException was unhandled
  HResult=-2147467261
  Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
  Source=Windows
  StackTrace:
       at Windows.UI.Xaml.Controls.Frame.Navigate(Type sourcePageType, Object parameter)
       at Cirrious.MvvmCross.WindowsUWP.Views.MvxWindowsViewPresenter.Show(MvxViewModelRequest request)
       at Cirrious.MvvmCross.WindowsUWP.Views.MvxWindowsMainThreadDispatcher.RequestMainThreadAction(Action action)
       at Cirrious.MvvmCross.ViewModels.MvxNavigatingObject.ShowViewModel[TViewModel](IMvxBundle parameterBundle, IMvxBundle presentationBundle, MvxRequestedBy requestedBy)
       at Cirrious.MvvmCross.ViewModels.MvxAppStart`1.Start(Object hint)
       at Test.Uwp.App.OnLaunched(LaunchActivatedEventArgs e)
  InnerException: 

我使用的是Windows 10 RTM和Visual Studio 2015 RTM,没有beta位(MvvmCross除外)。

我做错了什么?

我非常喜欢MvvmCross,我开始将现有的Windows 8.1 / Windows Phone 8.1解决方案移植到Uwp - 只是对使用Uwp使用最新的MvvmCross位进行了一些探索性研究。

感谢您的帮助! @ehuna

2 个答案:

答案 0 :(得分:2)

您正在使用的视图不正确,您获得的AccessViolation是 - 诚然 - 完全没有帮助。问题似乎是运行时没有找到您指定的View并且因为一个模糊的异常而崩溃。

TestView.xaml看起来像

<views:MvxWindowsPage
    x:Class="Test.Uwp.Views.View1"
    ...

但它应该是

<views:MvxWindowsPage
    x:Class="Test.Uwp.Views.TestView"

分别是您的TestView.xaml.cs看起来像

public sealed partial class TestView : MvxWindowsPage<TestViewModel>
{
    public TestView()
    {
    }
}

但它看起来应该是这样的

public sealed partial class TestView : MvxWindowsPage
{
    public TestView()
    {
        this.InitializeComponent();
    }
}

然后一切都会好起来的。我获得了有趣的见解:MvxWindowsPage<TestViewModel>似乎根本不起作用。

答案 1 :(得分:1)

这是我发现的,可能会有所不同。 我创建了一个UWP应用程序(project1),添加了一个UWP库(project2)和一个project1引用项目2。 在库中添加页面。在project1 app.xaml.cs中,将rootFrame.Navigate(typeof(MainPage),e.Arguments)更改为rootFrame.Navigate(typeof(Project2.MainPage),e.Arguments),以便导航到project2中的页面。 运行并获得异常。 解决方法: 在project1 app.xaml中,添加以下内容以创建页面实例(作为资源,这无关紧要):

xmlns:project2="using:project2"
<Application.Resources>
<ResourceDictionary>
<project2:MainPage x:Key="MainPage"></view:MainPage>
</ResourceDictionary>
</Application.Resources>

运行应用程序,它的工作原理。 所以看起来异常的原因是由于其他项目中的页面尚未实例化。如果你在app.xaml中实例化它,它就可以工作。