.net 无法从.winmd文件获取类型

.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];

我想在给定路径的.winmd文件中输出类型。 我将winmd文件从Windows 8开发人员预览计算机复制到开发人员计算机。 我编写了一个小测试应用程序(在C#,.NET4.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 属性以获取更多信息

具有基础异常(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);
        }