C#中的访问冲突异常

5

以下是我的代码,今天突然出了异常,这是图片:

enter image description here

以下是整个页面的代码和异常信息:

 public frmWFDocumentDetail()
    {
        InitializeComponent();

        NavigationInTransition navigateInTransition = new NavigationInTransition();
        navigateInTransition.Backward = new TurnstileTransition { Mode = TurnstileTransitionMode.BackwardIn };
        navigateInTransition.Forward = new TurnstileTransition { Mode = TurnstileTransitionMode.ForwardIn };

        NavigationOutTransition navigateOutTransition = new NavigationOutTransition();
        navigateOutTransition.Backward = new TurnstileTransition { Mode = TurnstileTransitionMode.BackwardOut };
        navigateOutTransition.Forward = new TurnstileTransition { Mode = TurnstileTransitionMode.ForwardOut };
        TransitionService.SetNavigationInTransition(this, navigateInTransition);
        TransitionService.SetNavigationOutTransition(this, navigateOutTransition);

        DataContext = App.ViewModel_WFDocumentDetailItems;
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        //**this is how you pass parameters through to a new page**//
        string processID = "-1";
        string processName = "";
        NavigationContext.QueryString.TryGetValue("processID", out processID);
        NavigationContext.QueryString.TryGetValue("processName", out processName);

        App.ViewModel_WFDocumentHeaderItems.LoadData("johnny", processID);

        App.ViewModel_WFDocumentDetailItems.LoadData("johnny");

    }

访问冲突:

System.AccessViolationException: 企图读取或写入受保护的内存。这通常是其他内存损坏的迹象。

我已经研究过了,有些人说是nvidia网络管理器的问题,还有一些人说我必须设置一些设置,如Suppress JIT优化,并忽略gpu内存,如果值没有改变...但什么都不起作用?请问有人可以帮我指点一下吗?

按要求,以下是完整的堆栈:

enter image description here


2
你能贴出完整的堆栈吗?点击“查看详细信息”按钮,然后粘贴完整的堆栈(模糊化任何公司名称或识别用语)。如果你前往“调试->选项和设置->调试->常规->启用仅我的代码”,那么异常将给出最后一个“可步进”的行,并且你将停在实际位置。这可能是答案和无法回答之间的区别。 - taylorjonl
这张图片是你需要的吗? :) - Arrie
1
别把堆栈以监视窗口的图片形式发布,那完全没用。相反,捕获异常,调用 ToString() 方法并发布返回的文本。 - Ran
@taylorjonl!那个设置真的很好用!它帮我找到了我遇到的XAML错误,原来问题出在一个错过的“</”符号上! - Arrie
2
@Arrie,截图对人类来说很棒,但我们程序员喜欢文本...奇怪的是,我看到你的StackTrace为空,这意味着它无法遍历堆栈。通常会有一个值,与消息和异常类型一起对于调试异常至关重要。 - taylorjonl
现在我知道了!我把一张图片放进去有点傻,下次不会再发生了 :) - Arrie
3个回答

5

我使用了taylorjohnl提供的设置 "调试 -> 选项和设置 -> 调试 -> 一般 -> 启用只调试我的代码",然后错误就直接指向了一个语法错误的xaml片段,修复它后应用程序又可以正常工作了 :) 所以对我来说,违规错误基本上是一个引用错误,希望这也能帮助其他人,同时在Silverlight中使用Expression Blend来调试UI中的xaml。


1
我曾遇到类似的问题,最终通过向MS技术支持提交崩溃转储文件解决。以下是他们的回复:
问题的关键在于,崩溃是由Windows公共控件(comctl32.dll)版本5.0中已知的错误引起的。这个错误不会在公共控件版本5.0中得到修复,因为该版本适用于Windows XP之前的应用程序。它已经在comctl32.dll的版本6.0中得到修复,后者包含在Windows XP及以后的版本中。请注意,自Windows XP以来,每个Windows版本都包含comctl32.dll的两个版本(5.0和6.0)。较旧的版本只是为了向后兼容非常老的应用程序而存在。
要解决这个问题,你需要更改应用程序,使其选择使用comctl32.dll的版本6.0。在Windows Forms应用程序中,可以通过在应用程序启动时调用Application.EnableVisualStyles方法来完成此操作。如果你正在开发C#项目,则可以在应用程序入口点之前添加此调用,即在Application.Run调用之前。例如:
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();   //Add this line
        Application.Run(new Form1());
    }

如果您正在进行Visual Basic .Net项目,则可以通过转到项目属性,然后在应用程序属性页上选择“启用应用程序框架”和“启用XP视觉样式”复选框来选择此选项。一旦您执行此操作,它应该解决这个特定的访问冲突。

-1

InitializeComponent()中的代码是什么?其中有一些类引用了null(通常是事件处理程序)。一旦触发它,就会报告AccessViolation。


InitializeComponent通常是负责处理UI初始化的生成代码。除非他特意导航到.g.cs文件进行更改,否则他不会更改此代码。 - taylorjonl
从你的图片来看,错误似乎发生在那里。有时候当你自己改变事件处理程序时,可能会导致这个问题。 - ray_linn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接