2012-01-20 3 views
4

これは私を夢中にしています。別のアセンブリからTypeDefinitionを追加する

AssemblyDefinition asm1 = AssemblyDefinition.ReadAssembly(example); 
AssemblyDefinition asm2 = AssemblyDefinition.ReadAssembly(example2); 
asm2.MainModule.Types.Add(asm1.MainModule.Types[0]); 

私はこのエラー「タイプがすでにattached」の取得上記のコードを実行しようとするたびに 私はMonoCecilソースでこのエラーを探すことにしたと私はタイプのMainMoudleがASM2 MainModulesではないので、それは、このエラーがスローました。だから私はそのタイプを新しいものにコピーすることに決めました。

TypeDefinition type2 = new TypeDefinition("", "type2", Mono.Cecil.TypeAttributes.Class); 
foreach (MethodDefinition md in asm2.Methods) 
{ 
     type2.Methods.Add(md); 
} 

通常この型をアセンブリに追加しますが、これは別のエラー「指定されたメソッドはサポートされていません。」をスローします。 このエラーが発生する理由は何ですか?

編集:ちょうど私が追加しようとしているタイプは、ポインタを使用するいくつかのメソッドが含まれています。これが問題だろうか?私が知っている限り、モノは、混合モードではなく、それをサポートします。

+0

'asm1'で定義されているタイプの1つが' asm2'でも定義されているため、元のエラーは表示されませんでしたか? –

+0

いいえ、私は、私が追加しようとしているタイプがasm2にないことを完全に確信しています。 – method

答えて

6

私は恐れていますが、これを行う簡単な方法はありません。

Cecilを使用してアセンブリを読み込むと、メタデータが定義されているモジュールによってすべてのメタデータが結合されます。単純にモジュールからメソッドを取り出して別のメタデータに追加することはできません。

これを実現するには、MethodDefinitionを他のモジュールに関連付けられたMethodDefinitionに複製する必要があります。繰り返しますが、これにはまだ何も組み込まれていません。

オープンソースのILMergeクローンであるIL-Repackをご覧ください。それは正確には、異なるモジュールから型を取り、別のモジュールに型をコピーします。

+0

ええと、私はそれを見ていきますが、メソッドの各命令をループして新しいメソッドに追加して、それを自分のタイプに追加すると、最後の質問があります。それは働くだろうか? – method

+2

@ user959615命令は、呼び出し命令のためのメソッドのように、オペランドとしてメタデータを持つことができるため、使用できません。新しいモジュールへのメソッドへの参照に変更する必要があります。 –