【问题标题】:Cannot get types from .winmd file无法从 .winmd 文件中获取类型
【发布时间】:2012-02-03 23:02:30
【问题描述】:

我想在给定路径的 .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 属性以获取更多信息。

具有基础异常 TypeLoadException 的 LoaderExceptions 属性。它的 Message 属性为: Runtime Impl 属性使用不当。

有人知道我为什么看不懂这些类型吗?

谢谢。

注意:我知道我使用的是 .NET 4.0。但是,在 .NET 4.5(Windows 8 预览版中的那个)中,我无法在运行时从文件中加载程序集。 Assembly 类中没有方法可以做到这一点。

【问题讨论】:

    标签: .net reflection windows-runtime


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      WinMD 是仅限元数据的程序集。使用 ReflectionOnlyLoadFrom 应该可以解决问题。

      以下代码有效。

              var assembly = System.Reflection.Assembly.ReflectionOnlyLoadFrom(winmdPath);
      
      
              foreach (var type in assembly.GetTypes())
              {
                  Console.WriteLine("type found name = " + type.Name);
              }
      

      【讨论】:

        【解决方案3】:

        要使用 *.winmd 文件,您必须在 PropertyGroup 内的项目文件中设置

        <TargetPlatformVersion>8.0</TargetPlatformVersion>
        

        【讨论】:

          猜你喜欢
          • 2017-05-08
          • 2021-10-13
          • 2011-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-26
          相关资源
          最近更新 更多