C# 为什么.NET Native上的Raygun会导致我的应用程序崩溃?

C# 为什么.NET Native上的Raygun会导致我的应用程序崩溃?,c#,uwp,raygun,C#,Uwp,Raygun,我正在使用Raygun.io(5.2.0)开发一个Windows10商店应用程序。我们发布了几次应用程序(最新一次是在12月中旬),我在Rayguns的web界面上看到了以前版本的日志。在发布下一个版本之前,我现在测试应用程序时发现,如果应用程序是使用.NET本机工具链构建的,则在发送异常时Raygun不再工作(=崩溃)。 我可以在一个简单的UWP测试应用程序中重现这一点: public sealed partial class MainPage : Page { //private r

我正在使用Raygun.io(5.2.0)开发一个Windows10商店应用程序。我们发布了几次应用程序(最新一次是在12月中旬),我在Rayguns的web界面上看到了以前版本的日志。在发布下一个版本之前,我现在测试应用程序时发现,如果应用程序是使用.NET本机工具链构建的,则在发送异常时Raygun不再工作(=崩溃)。 我可以在一个简单的UWP测试应用程序中重现这一点:

public sealed partial class MainPage : Page
{
    //private readonly RaygunClient _raygunClient;

    public MainPage()
    {
        InitializeComponent();

        RaygunClient.Attach("<app_key>");
        //_raygunClient = new RaygunClient("<app_key>");
    }

    private async void OnClick(object sender, RoutedEventArgs e)
    {
        try
        {
            // this is crashing the app when project is build using .NET native toolchain
            // it is not even throwing exception
            //await _raygunClient.SendAsync(new InvalidOperationException("Raygun Test"));
            await RaygunClient.Current.SendAsync(new InvalidOperationException("Raygun Test")); // (1)
            Status.Text = "Ok";
        }
        catch (Exception exception) // (2)
        {
            Status.Text = $"Failed with {exception.Message}";
        }
    }
}

摘自微软:

如果运行时缺少必要的元数据或实现代码, .NET本机运行时引发异常。你可以防止这些 异常,并确保.NET本机工具链包括 所需的元数据和实现代码,通过使用, 指定程序元素的XML文件 其元数据或实现代码必须在运行时可用,并且 为它们分配运行时策略

从Microsoft开始:

由.NET本机工具链生成的结果应用程序是 写入调试或发布目录中名为ilc.out的目录 您的项目目录。它由以下文件组成:

•appName.exe,一种存根可执行文件,可将控制权简单地转移到 appName.dll中的特殊主导出

•appName.dll,一个Windows动态链接库,包含所有 应用程序代码以及.NET Framework类中的代码 库以及您依赖的任何第三方库。 它还包含支持代码,例如 与Windows互操作并序列化应用程序中的对象

•mrt100_app.dll,一个提供运行时服务的重构运行时 比如垃圾收集


我们已经完成了调查,这确实是.NET Native中的一个bug。问题是,在某些情况下,我们没有正确处理所有涉及无效强制转换的情况。专门将数组强制转换为具有多个泛型参数的泛型类型。通过检查SimpleJson.SerializeValue,您可以在Raygun中看到我们将遇到的问题:

一种解决方法是首先避免让此代码路径序列化数组。另一种方法是先打补丁给RayGun检查阵列情况,避免它试图做的所有其他猜测

您没有看到异常的原因是,运行时对各种断言和下降低谷非常谨慎,因此在这些情况下,它会调用操作系统FailFast


希望能有帮助。

什么叫“崩溃”?什么是异常?这意味着应用程序被终止,并且没有异常。不,总是有异常的。它可能不会被C#捕获,但在某个地方有一个例外。你试过检查Windows事件日志吗?我用事件查看器日志描述更新了问题。在Google上找不到任何相关内容。这是调试器.Break()引发的异常。它试图告诉你一些事情,但由于没有附加调试器,应用程序崩溃。如果您无法在自己的机器上重新编程,请联系供应商寻求支持。那么您的建议是Raygun正在使用反射?我尝试添加运行时指令(),为Mindscape.Raygun4Net启用所有功能,行为相同。
Faulting application name: rayguntest.exe, version: 1.0.0.0, time stamp: 0x56a0edc9
Faulting module name: mrt100_app.dll, version: 1.0.23406.0, time stamp: 0x561408ce
Exception code: 0x80000003
Fault offset: 0x000000000000a0ad
Faulting process id: 0x305c
Faulting application start time: 0x01d1545a0fea5649
Faulting application path: C:\Projects\rayguntest\rayguntest\bin\x64\Release\AppX\rayguntest.exe
Faulting module path: C:\Program Files\WindowsApps\Microsoft.NET.Native.Runtime.1.1_1.1.23406.0_x64__8wekyb3d8bbwe\mrt100_app.dll
Report Id: 52bbeeb5-97c6-4814-b5dc-51ee6c3fa9bd
Faulting package full name: 6ca59c51-ed22-482b-acf6-12d241079f4d_1.0.0.0_x64__1d8r4kqm7qz2y
Faulting package-relative application ID: App