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

时间:2012-02-03 23:02:31

标签: .net reflection windows-runtime

我想在给定路径的情况下输出.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类中没有方法可以做到这一点。

3 个答案:

答案 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>