2012-02-03 77 views
3

我想在給定其路徑的情況下輸出.winmd文件中的類型。 我從Windows 8 Developer Preview機器上覆制了一個winmd文件到我的開發機器。 我寫了一個小測試應用程序(在C#中,.NET 4.0,而不是4.5),它試圖在運行時加載程序集,給定其路徑,並輸出其中的類型。 雖然程序集已加載,但我嘗試獲取類型時發生異常。無法從.winmd文件獲取類型

下面是代碼:

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。其消息屬性如下: 運行時Impl屬性使用不當。

有人知道爲什麼我不能讀取類型?

謝謝。

注:我知道我使用.NET 4.0。但是,在.NET 4.5(Windows 8預覽版)中,我無法在運行時從文件加載程序集。 Assembly類中沒有這樣做的方法。

回答

4

雖然.winmd文件使用ECMA 355文件格式,但它們不是.Net程序集,並且您很可能無法直接使用.Net框架讀取文件。

如果使用開發人員預覽附帶的ILDASM版本,則可以直觀地查看文件中的類型。您還可以使用ildasm轉儲包含元數據文件中的類型的文本文件。我相信.Net反射器也可以做到這一點。

如果您需要以編程方式枚舉winmd文件中的類型,我建議您使用unmanaged metadata reading APIs。這就是我們如何在內部爲我們的開發工具讀取元數據文件。

如果您正在運行開發人員預覽版本,我會建議您查看RoGetMetaDataFile API--這是Chakra JavaScript引擎用於打開特定類型的元數據文件的API。

0

要使用必須設置* .winmd文件可以在您的項目文件中PropertyGroup

<TargetPlatformVersion>8.0</TargetPlatformVersion> 
2

WinMDs是僅元數據集。使用ReflectionOnlyLoadFrom應該做到這一點。

以下代碼有效。

 var assembly = System.Reflection.Assembly.ReflectionOnlyLoadFrom(winmdPath); 


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