【发布时间】:2019-07-14 23:15:09
【问题描述】:
我在 UWP 应用程序中有以下代码,它在调试模式下运行良好,但在 Release / .Net Native 中编译时抛出异常。
var type = typeof(IHashCommand);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.Where(x => type.IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract);
抛出的异常是:
System.TypeLoadException: '类型 'System.Runtime.InteropServices.Marshallers.BaseMarshaller' 不能 在程序集 'System.Private.Interop, Version=999.999.999.999, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.'
我尝试编辑“Default.rd.xml”文件并根据我找到的一些文档添加了一个命名空间节点(它不起作用或我没有正确设置它)。
<Namespace Name="MudLib.HashCommands" Activate="Required All" Dynamic="Required All" Browse="Required All" />
实际上我要做的是反映该命名空间中实现 IHashCommand 接口的所有类,然后激活它们。
有人知道我错过了什么或有什么我应该去的方向吗?
【问题讨论】:
-
您可能希望拆分一个大语句,以便更好地了解导致异常的语句
-
您会遇到困难的部分原因是这种结构将导致 .NET Native 不得不做更多的工作(我们可能会搞砸)。我们不太适合像这样的广泛的运行时反射指令。我很想了解您要完成的事情,也许有更好的方法。例如,我可以想象基于注册的模式会让我们更轻松。当然,这取决于您的目标。
-
@Flydog57 我把它分开了,它首先在“x => type.IsAssignableFrom(x)”上失败。
-
@MattWhildenMSFT 我有一个 UWP 程序(基本上是用于基于文本的游戏的专用 telnet 应用程序)。我正在努力与 WPF 版本共享核心逻辑。我的解释器加载了一组命令(来自这些类),用户可以从他们的命令行执行这些命令。尽管大多数命令在 UWP 和 WPF 之间共享,但有些命令不是由于 UWP 支持。我试图通过反射加载它们,所以它只会知道基于构建目标(UWP 或 WPF)的内容。我的解决方法(您可能会暗示)将使用平台指令并手动加载它们。
-
知道了。因为 .NET Native 都是提前编译的,所以有一个相当重量级的机器会尝试确定您在运行时需要的所有反射上下文。循环所有程序集中的所有类型对我们的分析来说压力特别大。大多数时候我们做得很好,但你可以通过更明确地写下事情来避免这个问题。听起来你在正确的轨道上获得畅通。如果您遇到其他问题,您可以随时通过 dotnetnative@microsoft.com 与我们联系。乐于助人。
标签: c# uwp .net-native