我想在给定路径的情况下输出.winmd文件中的类型。 我将winmd文件从我的Windows 8 Developer Preview机器复制到我的开发机器。 我写了一个小测试应用程序(在C#,.NET 4.0,而不是4.5),它尝试在运行时加载程序集,给定其路径,并输出其中的类型。 虽然程序集已加载,但当我尝试获取类型时发生异常。
以下是代码:
static void Main(string[] args)
{
if (args.Length != 1) return;
var path = args[0];
if (!System.IO.File.Exists(path))
{
Console.WriteLine("file not found : " + path);
return;
}
var asm = System.Reflection.Assembly.LoadFrom(path); // load successful.
Console.WriteLine("loaded ");
string name = asm.GetName().Name;
Console.WriteLine(name);
System.Type[] types = asm.GetTypes(); // exception occurs here
foreach(var type in types)
{
// output type name
}
}
异常是ReflectionTypeLoadException类型。其Message属性为:无法加载一个或多个请求的类型。检索LoaderExceptions 物业了解更多信息。
具有基础异常的LoaderExceptions属性,TypeLoadException。它的Message属性如下: 错误使用Runtime Impl属性。
有人知道为什么我看不懂这些类型吗?
感谢。
注意:我知道我使用的是.NET 4.0。但是,在.NET 4.5(Windows 8预览版中的那个)中,我无法在运行时从文件加载程序集。在Assembly类中没有方法可以做到这一点。
答案 0 :(得分:4)
虽然.winmd文件使用ECMA 355文件格式,但它们不是.Net程序集,并且您不太可能直接使用.Net框架读取文件。
如果您使用开发人员预览版附带的ILDASM版本,则可以直观地查看文件中的类型。您还可以使用ildasm转储包含元数据文件中类型的文本文件。我相信.Net反射器也可以做到这一点。
如果您需要以编程方式枚举winmd文件中的类型,我建议您使用unmanaged metadata reading APIs。这就是我们在内部阅读开发工具的元数据文件的方式。
如果您正在运行开发人员预览版本,我建议您查看RoGetMetaDataFile API - 这是Chakra javascript引擎用于打开特定类型的元数据文件的API。< / p>
答案 1 :(得分:2)
WinMDs是仅元数据的程序集。使用ReflectionOnlyLoadFrom可以做到这一点。
以下代码有效。
var assembly = System.Reflection.Assembly.ReflectionOnlyLoadFrom(winmdPath);
foreach (var type in assembly.GetTypes())
{
Console.WriteLine("type found name = " + type.Name);
}
答案 2 :(得分:0)
要使用* .winmd文件,您必须在PropertyGroup
<TargetPlatformVersion>8.0</TargetPlatformVersion>