Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将WinForm应用程序中的异常冒泡到WPF应用程序中。可能吗?_C#_Wpf_Vb.net_Winforms_Error Handling - Fatal编程技术网

C# 将WinForm应用程序中的异常冒泡到WPF应用程序中。可能吗?

C# 将WinForm应用程序中的异常冒泡到WPF应用程序中。可能吗?,c#,wpf,vb.net,winforms,error-handling,C#,Wpf,Vb.net,Winforms,Error Handling,在我的解决方案中,我的主要项目是WPF c#项目。在解决方案中,我需要集成一个遗留项目,即VB winforms项目。这是通过WPF项目中的一个包装器类来完成的,该包装器类处理我遗留项目中的一些公共对象 在我的WPF项目中,我实现了Application_dispatchernhandledexception,以便将异常冒泡到这里,并将它们记录到数据库中进行调试 我遇到的问题是,每当遗留项目中的某些内容崩溃时(例如NullReferenceException),代码永远不会到达主WPF项目中的应

在我的解决方案中,我的主要项目是WPF c#项目。在解决方案中,我需要集成一个遗留项目,即VB winforms项目。这是通过WPF项目中的一个包装器类来完成的,该包装器类处理我遗留项目中的一些公共对象

在我的WPF项目中,我实现了Application_dispatchernhandledexception,以便将异常冒泡到这里,并将它们记录到数据库中进行调试

我遇到的问题是,每当遗留项目中的某些内容崩溃时(例如NullReferenceException),代码永远不会到达主WPF项目中的应用程序的实现


是否可以将所有未处理的异常从WinForms项目重定向到WPF项目?

如果您能发布一个包装器外观的示例,那就太好了。 以及如何“启动winforms应用程序” 您是否有权访问项目的实际
表单

虽然这并不完全是“冒泡”,但可以编写一个包装器,强制在调度程序上“重新启动”异常

internal class WinFormsWrapper
{
    private Form _form;

    public WinFormsWrapper(Form f)
    {
        _form = f;            
    }

    public void Run()
    {
        //Winforms exceptions thrown on the message loop should go here
        //this handler will force them do be "rethrown" on the calling dispatcher
        System.Windows.Forms.Application.ThreadException += (wf_sender, wf_e) => { ExceptionDispatchInfo.Capture(wf_e.Exception).Throw(); };
        System.Windows.Forms.Application.Run(_form);
    }
}

如果异常从未到达您的代码,那么WinForm项目中必须有一个捕获异常的异常处理程序。要使异常冒泡,您需要在windform异常处理程序中添加一个“throw”。请参阅:这个问题可以使用更多信息来说明“集成”是如何完成的-来自代码的托管部分(即表单构造函数)的异常将正确地出现。“messageloop”上的东西引发的异常(几乎所有在节目结束后发生的事情)不会发生。一个选项是在Main函数中设置一个catch块(您需要在WPF中手动添加Main),尽管您仍然不应该期望捕获在诸如Paint/Load之类的东西中抛出的异常。在我的WPF项目中,我将初始化包装器的一个类,它反过来调用我的winForms项目的构造函数。我将一些事件附加到我在WPF项目中处理的winForm对象,使我能够在我的c#代码中实现我自己的逻辑。当处理winForm事件的代码出错时,它会在winForm项目中崩溃,而我的WPF应用程序_DispatcherUnhandledException无法捕获。取而代之的是,我得到了一个未处理的错误消息框,WinForms是默认的(这一个:),试着看看这个。