Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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# c应用程序遇到问题且无明显原因关闭。第三方DLL可能存在的问题_C# - Fatal编程技术网

C# c应用程序遇到问题且无明显原因关闭。第三方DLL可能存在的问题

C# c应用程序遇到问题且无明显原因关闭。第三方DLL可能存在的问题,c#,C#,我们正在构建一个c应用程序,它将位于垃圾车的PC上。在我们的开发机器上一切正常,但和往常一样,当我们部署到目标硬件上时,问题开始出现 其中一个特别让我们头疼。每隔一段时间,我们就会弹出一个windows消息框,说我们的应用程序遇到了问题,需要关闭 当对话框在那里时,应用程序仍然可以正常工作,当您单击关闭按钮时,应用程序显然会关闭。令人沮丧的是,我们没有异常,任何日志中都没有,系统活动日志中也没有。我的直觉是,我们用于GPS的第三方库出现了一些问题,这是一个非托管dll的.net包装器,我们以前遇

我们正在构建一个c应用程序,它将位于垃圾车的PC上。在我们的开发机器上一切正常,但和往常一样,当我们部署到目标硬件上时,问题开始出现

其中一个特别让我们头疼。每隔一段时间,我们就会弹出一个windows消息框,说我们的应用程序遇到了问题,需要关闭

当对话框在那里时,应用程序仍然可以正常工作,当您单击关闭按钮时,应用程序显然会关闭。令人沮丧的是,我们没有异常,任何日志中都没有,系统活动日志中也没有。我的直觉是,我们用于GPS的第三方库出现了一些问题,这是一个非托管dll的.net包装器,我们以前遇到过问题。我们有什么选项来尝试和调试这个??我对windows编程比较陌生,不知道是否有一些程序可以用来跟踪我们的代码正在调用dll的哪些部分

干杯 尼迈

是否添加了线程异常处理程序? 您正在记录异常吗? 您有什么类型的错误处理? 消息框的标题和文本是什么? 这是WinForms应用程序吗? GPS组件是否基于COM?如果是这样,请确保将有效参数传递给它的函数。 这是Win32异常吗?消息框是否显示Win32异常 这是COM例外吗? 您是否在应用程序中运行计时器来触发GPS组件调用? 您是否在应用程序中运行任何类型的计时器? 是否添加了线程异常处理程序? 您正在记录异常吗? 您有什么类型的错误处理? 消息框的标题和文本是什么? 这是WinForms应用程序吗? GPS组件是否基于COM?如果是这样,请确保将有效参数传递给它的函数。 这是Win32异常吗?消息框是否显示Win32异常 这是COM例外吗? 您是否在应用程序中运行计时器来触发GPS组件调用? 您是否在应用程序中运行任何类型的计时器?
我觉得,当第三方本地dll本身可能出现问题时,这些东西很难调试

同时,为了让你的应用程序更加健壮,你可以将包装程序集加载到一个动态加载的应用程序域中,而不是直接加载到你的应用程序中,这样DLL只会使应用程序域而不是整个应用程序崩溃。如果需要,您可以使用一些代码重新启动应用程序域。请注意,这并不能解决您的问题,但至少会使应用程序在现场更加健壮

注意,在应用程序域之间的数据编组方面有一些困难需要克服,但没有什么太繁重的


编辑:这里有一个示例,提供了一个示例

我觉得这很难调试,因为第三方原生dll本身可能存在问题

同时,为了让你的应用程序更加健壮,你可以将包装程序集加载到一个动态加载的应用程序域中,而不是直接加载到你的应用程序中,这样DLL只会使应用程序域而不是整个应用程序崩溃。如果需要,您可以使用一些代码重新启动应用程序域。请注意,这并不能解决您的问题,但至少会使应用程序在现场更加健壮

注意,在应用程序域之间的数据编组方面有一些困难需要克服,但没有什么太繁重的


编辑:下面是一个示例,提供了一个示例

尝试记录所有异常

    static void Main(string[] args)
    {
        Application.ThreadException += ApplicationThreadException;
        AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;

        //Your code would go here
        throw new Exception("a");
    }

    static void ApplicationThreadException(object sender, ThreadExceptionEventArgs e)
    {
        LogException(e.Exception);
    }
    static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        LogException(e.ExceptionObject);
    }

    private static void LogException(object exception)
    {
        //you could of course log anywhere
        EventLog.WriteEntry("ConsoleApplication1", exception.ToString(), EventLogEntryType.Error);
    }

尝试记录所有异常

    static void Main(string[] args)
    {
        Application.ThreadException += ApplicationThreadException;
        AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;

        //Your code would go here
        throw new Exception("a");
    }

    static void ApplicationThreadException(object sender, ThreadExceptionEventArgs e)
    {
        LogException(e.Exception);
    }
    static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        LogException(e.ExceptionObject);
    }

    private static void LogException(object exception)
    {
        //you could of course log anywhere
        EventLog.WriteEntry("ConsoleApplication1", exception.ToString(), EventLogEntryType.Error);
    }

谢谢你们的回答,伙计们。你给了我很多可靠的线索。谢谢你的回答。你给了我很多可靠的线索。