2009-11-15 12 views
7

私はSystem.CodeDom.CodeCompileUnitを使用していくつかの型を動的に構築し、それらをメモリ内のILコードにコンパイルし、そのILコードをメモリにロードされたアセンブリに挿入したいと思います - これをディスクに保存する必要はありません。多分私の述べた計画は間違っています。その目的地にそのCodeCompileUnitインスタンスを取得する方法に関する他の提案があります。コードを発行してロードされたアセンブリに注入するにはどうすればよいですか?

+1

なぜ、すでに読み込まれているアセンブリに型を挿入する必要がありますか?なぜあなたは現在それらをビルドしているアセンブリに注入できないのですか? – yfeldblum

+1

@ Justice:それは良い点です。何よりも好奇心です。シナリオを工夫しなければならないとすれば、メモリで作業するだけでアセンブリを構築するというファイルシステムのアクセス許可を回避することができます。あるいはアセンブリにコードを注入し、アプリケーションを再コンパイルせずに物を検査するために動的に呼び出すことができます。 –

+0

私はこれを行う方法があるかどうかはわかりません。もしあれば、私も知りたいのですが。 –

答えて

7

ICorDebugインターフェイスを使用して、既存の(すでにロードされている)アセンブリにコードを注入できます。編集して続行します。

デルタバイトを計算し、ICorDebugModule2::ApplyChangesを呼び出します。詳細はMDbg sample codeを参照してください。

以前は、ICorDebugModule::GetEditAndContinueSnapshotとkinを使用していましたが、現在は廃止予定です。

更新あなただけの新しいアセンブリを作成するために、Reflection.Emitを使用すると、より効率的で、非常に簡単に、既に読み込まれたアセンブリにコードを注入することを気にしない場合。

+0

この解決策は質問に直接答えます。ありがとう。 –

1

System.Reflection.Emit名前空間を使用して、動的なメモリ内アセンブリを作成することもできます。

代わりに、&をコンパイルコードを生成するためにCodeDomを使用して呼び出してください。

XMLSerialization()が後者を行います。

1

Mono.Cecilを使用してILを操作できます。これは強力なツールですが、何らかの理由でドキュメントが欠けています。

関連する問題