我正在开发一个使用 Raygun.io (5.2.0) 的 Windows 10 应用商店应用程序。我们发布了几次该应用程序(最近一次是在 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}";
}
}
}
检查 https://github.com/MindscapeHQ/raygun4net 支持的平台/框架,它似乎不支持显式 UWP。
更新:应用程序在第 (1) 行后被杀死,在 (2) 处没有异常在事件视图中,我可以看到:
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:Projectsrayguntestrayguntestbinx64ReleaseAppXrayguntest.exe
Faulting module path: C:Program FilesWindowsAppsMicrosoft.NET.Native.Runtime.1.1_1.1.23406.0_x64__8wekyb3d8bbwemrt100_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
我们已经完成了调查,这确实是 .NET Native 中的一个错误。问题在于,在某些情况下,我们没有正确处理所有涉及无效转换的情况。专门将数组强制转换为具有多个泛型参数的泛型类型。您可以在Raygun中看到我们将通过检查SimpleJson.SerializeValue遇到问题的地方:https://github.com/MindscapeHQ/raygun4net/blob/67c4bb9fd660afb91d62e9333d75a36a85ee5d4f/Mindscape.Raygun4Net/SimpleJson.cs#L1016
一种解决方法是首先避免让此代码路径序列化数组。另一个方法是修补RayGun以首先检查阵列情况,并避免它试图做的所有其他猜测。
您没有看到异常的原因是,运行时对各种断言和低谷非常防御,因此在这些情况下它会调用操作系统 FailFast。
希望有帮助。
自Microsoft:
如果运行时缺少必要的元数据或实现代码, .NET 本机运行时引发异常。你可以防止这些 例外,并确保 .NET 本机工具链包含 使用运行时指令文件所需的元数据和实现代码, 指定程序元素的 XML 文件 其元数据或实现代码必须在运行时可用,并且 为它们分配运行时策略。
从 .NET 本机和编译Microsoft:
由 .NET 本机工具链生成的应用是 写入调试或发布目录中名为 ilc.out 的目录 的项目目录。它由以下文件组成:
•appName.exe,一个存根可执行文件,只需将控制权转移给 特殊主导出在 appName.dll。
•appName.dll,一个包含所有 应用程序代码,以及来自 .NET Framework 类的代码 库和您依赖的任何第三方库。 它还包含支持代码,例如所需的代码 与 Windows 互操作,并在应用中序列化对象。
•mrt100_app.dll,提供运行时服务的重构运行时 例如垃圾回收。