我希望输出给定路径的.winmd文件中的类型。我将一个winmd文件从我的Windows 8开发人员预览机复制到我的开发机器上。我编写了一个小型测试应用程序( 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类型。其消息属性为:无法加载一个或多个请求类型。检索LoaderExceptions属性以获得更多信息。
具有基础异常的LoaderExceptions属性TypeLoadException。其消息属性为:运行时Impl属性使用不当。
有人知道我为什么看不懂这些类型吗?
谢谢。
注意:我知道我正在使用.NET 4.0。但是,在Windows4.5(Windows8预览版)中,我无法在运行时从文件加载程序集。程序集类中没有这样做的方法。
发布于 2012-02-04 17:23:30
虽然.winmd文件使用ECMA355文件格式,但它们不是.Net程序集,您很难直接使用.Net框架读取这些文件。
如果使用开发人员预览版附带的ILDASM版本,则可以直观地查看文件中的类型。还可以使用ildasm转储包含元数据文件中的类型的文本文件。我相信.Net反射器也能做到这一点。
如果需要编程地枚举winmd文件中的类型,我建议您使用非托管元数据读取API。这就是我们如何在内部读取开发工具的元数据文件。
如果您在开发人员预览构建上运行,我建议您查看RoGetMetaDataFile API --这是Chakra引擎用于打开特定类型的元数据文件的API。
发布于 2016-08-26 01:03:44
WinMD仅为元数据程序集。使用ReflectionOnlyLoadFrom应该可以做到这一点。
下面的代码可以工作。
var assembly = System.Reflection.Assembly.ReflectionOnlyLoadFrom(winmdPath);
foreach (var type in assembly.GetTypes())
{
Console.WriteLine("type found name = " + type.Name);
}发布于 2013-02-17 09:14:39
若要处理*.winmd文件,必须在PropertyGroup中的项目文件中设置
<TargetPlatformVersion>8.0</TargetPlatformVersion>https://stackoverflow.com/questions/9136683
复制相似问题