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

标签 .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 类中没有执行此操作的方法。

最佳答案

虽然 .winmd 文件使用 ECMA 355 文件格式,但它们不是 .Net 程序集,您不太可能直接使用 .Net 框架读取这些文件。

如果您使用开发人员预览版附带的 ILDASM 版本,您可以直观地查看文件中的类型。您还可以使用 ildasm 转储包含元数据文件中类型的文本文件。我相信 .Net 反射器也可以做到这一点。

如果您确实需要以编程方式枚举 winmd 文件中的类型,我建议您使用 unmanaged metadata reading APIs .这就是我们在内部读取开发工具的元数据文件的方式。

如果您运行的是开发人员预览版,我建议您查看 RoGetMetaDataFile API - 这是 Chakra javascript 引擎用来打开特定类型的元数据文件的 API。

关于.net - 无法从 .winmd 文件获取类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9136683/

相关文章:

java - 如何改进代码设计以消除 Java 中对 'instanceof' 的需要?

windows-8 - 为什么 Windows 应用商店应用程序要使用 WebSockets 而不是原始 TCP?

c# - 带条纹的照片

c# - 在 Windows Phone 8.1 Universal Store App 中触发警报?

c# - 如何在多个项目中使用 useLegacyV2RuntimeActivationPolicy?

c# - 独占锁定文件然后删除/移动它

C# 无法从泛型方法调用重载的非泛型方法

.net - .NET Framework 4 的向后兼容性

c# - Visual Studio 大型解决方案中最喜欢的项目

c# - 确定类型是否可转换为 IDictionary<string, object>,其中 Key 可以是任何类型