【发布时间】:2017-09-28 04:23:24
【问题描述】:
我们需要遍历应用程序中的所有程序集,然后获取具有 DataContract 类型的 CustomAttribute 的类型。这是当前未针对 .NET Native 编译时在 UWP 中工作的代码:
public async Task Initialise()
{
var files = await Package.Current.InstalledLocation.GetFilesAsync();
if (files == null)
{
return;
}
_Assemblies = new List<Assembly>();
foreach (var file in files.Where
(
file => (file.FileType.ToLower() == ".dll" || file.FileType == ".exe") &&
!new List<string> { "clrjit", "clrcompression", "sqlite3", "ucrtbased" }.Contains(file.DisplayName)
))
{
try
{
_Assemblies.Add(Assembly.Load(new AssemblyName(file.DisplayName)));
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
_Types = _Assemblies.SelectMany
(
a => a.GetTypes().Where
(
t => t.GetTypeInfo().GetCustomAttribute<DataContractAttribute>() != null ||
t.GetTypeInfo().GetCustomAttribute<CollectionDataContractAttribute>() != null
)
).ToList();
}
为 .NET Native 工具链编译时失败。首先,我们只看到一个程序集,它是一个 exe,并且其中没有类型。
我们需要改变什么?我们如何获取程序集及其类型?
注意:我们真正需要的是 .NET Native 支持和不支持的反射 API 的明确列表。
【问题讨论】:
-
好吧,那是个坏主意。它与 api 支持没有任何关系,.NET Native 编译器非常积极地删除似乎不用于生成最小可执行文件的类型。反射是一个问题,反射类型名称在代码中并不明确。由于它在代码中找不到对这些属性类型的任何引用,因此不会包含它们。您必须手动将它们添加到 rd.xml 文件中。所有关于 .NET Native 的文档都谈到了这一点。
-
这根本没有帮助。
标签: c# .net reflection types .net-native