2012-02-03 9 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です。メッセージのプロパティは次のとおりです。要求されたタイプの1つ以上を読み込めません。詳細については、LoaderExceptions プロパティを取得してください。

基本的な例外であるTypeLoadExceptionを持つLoaderExceptionsプロパティ。メッセージのプロパティは次のように表示されます。 Runtime 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です。あなたはPropertyGroup

<TargetPlatformVersion>8.0</TargetPlatformVersion> 
0

は、メタデータのみのアセンブリです。 ReflectionOnlyLoadFromを使用すると、そのトリックを行う必要があります。

次のコードが機能します。

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


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

WinMDs内のプロジェクトファイルに設定する必要があります* .winmdファイルで動作するように

関連する問題