System.Reflection.MissingRuntimeArtifactException - 处于发布模式

System.Reflection.MissingRuntimeArtifactException - in release mode

我正在尝试编译 UWP 应用程序。它在调试模式下 运行 没问题,但是在发布模式下尝试 运行 它时我得到这个错误:

Exception thrown: 'System.Reflection.MissingRuntimeArtifactException' in System.Private.Reflection.Core.dll

Additional information: MakeGenericMethod_NoMetadata, System.Linq.Enumerable.Distinct<System.Int32>(System.Collections.Generic.IEnumerable<System.Int32>).

在 VS2015 中打入异常时也得到这个信息(仍然是 release 模式):

ExecutionEnvironment.cs not found

我在 SO 中找到了类似的 issue/solution,但这对我来说不起作用:

我正在使用 UWP SDK 1.1。

更新:我还发现了这个:http://dotnet.github.io/native/troubleshooter/method.html#

...但我不确定这是否是答案,也不确定如何根据上面提供的信息使用该工具。

更新 2:.NET Native 一般故障排除:https://msdn.microsoft.com/en-us/library/dn600643(v=vs.110).aspx

我找到了解决办法。事实证明,这与 AutoMapper 和 .NET Native 的特定组合有关。在这种特殊情况下,更改运行时指令是一个弯路。

在我的代码中,我有一个 AutoMapper 配置,看起来像这样:

Mapper.CreateMap<SomethingGood, ISomething>().As<SomethingBetter>(); 

当应用程序未编译为 .NET Native 工具链时(即 运行 在调试模式下),此方法有效。但是,在编译发布时,此 AutoMapper 代码会中断。

此外,在 class SomethingBetter 中,我定义的属性比在 ISomething 和 SomethingGood class 中定义的属性更多。这是一个错误,但在调试模式下没有引起注意。编译为 .NET Native 时,应用程序会抛出 'System.Reflection.MissingRuntimeArtifactException'。

为了追踪这个错误,我使用了 .NET Native 调试引擎。如果不使用它,几乎不可能找出异常的根本原因。

这篇博客 post 很好地解释了如何使用 .NET Native 调试器:http://blogs.msdn.com/b/visualstudioalm/archive/2015/07/29/debugging-net-native-windows-universal-apps.aspx

此外,将此 try/catch 放在所有 AutoMapper.Mapper.CreateMap 的末尾对于追踪导致问题的属性非常有帮助:

        try
        {
            AutoMapper.Mapper.AssertConfigurationIsValid();
        }
        catch (Exception ex)
        {

            throw ex;
        }