【发布时间】:2016-02-08 15:09:45
【问题描述】:
我希望以编程方式获取 WinMD 文件中的所有命名空间。我更喜欢基于 PowerShell 或 C# 的解决方案,因为我需要它在脚本中,但只要能完成工作,任何语言都可以。
这是我现在的代码,使用Assembly.ReflectionOnlyLoadFrom:
var domain = AppDomain.CurrentDomain;
ResolveEventHandler assemblyHandler = (o, e) => Assembly.ReflectionOnlyLoad(e.Name);
EventHandler<NamespaceResolveEventArgs> namespaceHandler = (o, e) =>
{
string file = WindowsRuntimeMetadata
.ResolveNamespace(e.NamespaceName, Array.Empty<string>())
.FirstOrDefault();
if (file == null)
return;
var assembly = Assembly.ReflectionOnlyLoadFrom(file);
e.ResolvedAssemblies.Add(assembly);
};
try
{
// Load it! (plain .NET assemblies)
return Assembly.LoadFrom(path);
}
catch
{
try
{
// Hook up the handlers
domain.ReflectionOnlyAssemblyResolve += assemblyHandler;
WindowsRuntimeMetadata.ReflectionOnlyNamespaceResolve += namespaceHandler;
// Load it again! (WinMD components)
return Assembly.ReflectionOnlyLoadFrom(path);
}
finally
{
// Detach the handlers
domain.ReflectionOnlyAssemblyResolve -= assemblyHandler;
WindowsRuntimeMetadata.ReflectionOnlyNamespaceResolve -= namespaceHandler;
}
}
由于某种原因,它似乎不起作用。当我运行它时,当我尝试加载 WinMD 文件时,我得到一个ReflectionTypeLoadException。 (您可以查看this question 了解完整详情。)
所以我的问题是,如果反射 API 不起作用,最好的方法是什么?当您在 WinRT 类型上按 F12 时,Visual Studio 或 ILSpy 等工具如何执行此操作?有什么办法可以通过 PowerShell 做到这一点?
TL;DR: 如何从 WinMD 文件中提取所有命名空间?接受任何语言解决方案。
谢谢。
【问题讨论】:
-
ILSpy 你 Mono.Cecil 进行装配检查。
-
Roslyn 使用的元数据阅读器是另一个不错的选择:nuget.org/packages/System.Reflection.Metadata
标签: c# powershell reflection windows-runtime .net-assembly