.net 无法从.winmd文件获取类型
我想在给定路径的.winmd文件中输出类型。 我将winmd文件从Windows 8开发人员预览计算机复制到开发人员计算机。 我编写了一个小测试应用程序(在C#,.NET4.0,而不是4.5中),它尝试在运行时加载程序集,给定其路径,并输出其中的类型。 虽然程序集已加载,但在尝试获取类型时发生异常 代码如下:.net 无法从.winmd文件获取类型,.net,reflection,windows-runtime,.net,Reflection,Windows Runtime,我想在给定路径的.winmd文件中输出类型。 我将winmd文件从Windows 8开发人员预览计算机复制到开发人员计算机。 我编写了一个小测试应用程序(在C#,.NET4.0,而不是4.5中),它尝试在运行时加载程序集,给定其路径,并输出其中的类型。 虽然程序集已加载,但在尝试获取类型时发生异常 代码如下: static void Main(string[] args) { if (args.Length != 1) return; var path = args[0];
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
属性以获取更多信息
具有基础异常(TypeLoadException)的LoaderExceptions属性。其消息属性为:
运行时Impl属性使用不当
有人知道我为什么看不懂字体吗
谢谢
注意:我知道我正在使用.NET4.0。但是,在.NET4.5(Windows8预览版中的版本)中,我无法在运行时从文件加载程序集。Assembly类中没有方法可以执行此操作。虽然.winmd文件使用ECMA 355文件格式,但它们不是.Net程序集,并且您很可能无法使用.Net framework直接读取文件 如果使用开发人员预览附带的ILDASM版本,则可以直观地查看文件中的类型。还可以使用ildasm转储包含元数据文件中类型的文本文件。我相信.NETReflector也能做到这一点 如果您确实需要在winmd文件程序中枚举类型,我建议您使用。这就是我们在内部读取开发工具元数据文件的方式
如果您正在开发人员预览版本上运行,我建议您查看API-这是Chakra javascript引擎用于打开特定类型元数据文件的API。要使用*.winmd文件,必须在项目文件
PropertyGroup
<TargetPlatformVersion>8.0</TargetPlatformVersion>
8.0
WinMD是仅元数据的程序集。使用ReflectionOnlyLoadFrom应该可以做到这一点
下面的代码可以工作
var assembly = System.Reflection.Assembly.ReflectionOnlyLoadFrom(winmdPath);
foreach (var type in assembly.GetTypes())
{
Console.WriteLine("type found name = " + type.Name);
}