2011-12-02 7 views
0

この質問はこの質問に似ていますが、How do I attach a method to a dynamically-created C# type at runtime?には、私はlooknigの答えが含まれていません。ILを使用せずに、動的に作成されたタイプの既存のC#メソッドを添付

私はタイプを動的に作成し、別のプロジェクトで使用できるダイナミックアセンブリDLLに保存しています。

しかし、私はこの動的型にC#静的メソッドを "attach"してコンストラクタで呼び出す必要があります。 (この方法は少し複雑なので)。

これを行う方法の1つは、別のプロジェクトのC#でメソッドを記述し、それを呼び出すためにリフレクションを動的型で使用することです。しかし、これは、動的タイプが第2のアセンブリと一緒に出荷されなければならないことを意味する。

もう1つの方法は、メソッドを動的に作成し、それにILを書き込むことです。あまりにも多くの努力が必要と思うので、私はこれを避けたいと思います。 C#で書かれた既存のメソッドを取得し、それを動的な型に単にコピーする方法はありますか?

更新

私は現在AssemblyBuilder、およびModuleBuilder.DefineTypeを使用して新しいタイプを作成しています。

MethodInfo.GetMethodBody()。GetILAsByteArray()を使用してMethod Bodyを取得しようとしましたが、MethodBuilder.CreateMethodBody()を使用して新しく定義されたメソッド本体を設定しましたが、何らかの理由で動作しません。私はILコードが〜450バイトしかないことに気付きました。このスペースは、このスペースを使い尽くす文字列リテラルがいくつかあるので、私にとっては小さすぎるようです。私はこの作業をするために必要ないくつかの追加事項があると推測しています。

逆の質問として、タイプ全体を動的アセンブリにコピーできますか?

+0

新しく作成されたタイプに固有の処理は、添付するメソッドで行いますか? – Yahia

+0

ダイナミックタイプを作成するために何を使用していますか? Reflection.Emit? –

+0

これが可能な唯一の方法は仮想メソッドです。つまり、コンストラクタで仮想メソッドを呼び出すことは完全なノー・ノーです。 – leppie

答えて

0

少し遅れましたが、私はExpression Treesを使ってこの問題を解決し、this SO questionに応答してanswered hereとしてMethodBuilderにコンパイルしました。要約:

生ILを発行する代わりに式ツリーを使用する。

var queue = new Queue<Expression>(); 
var arguments = Expression.Parameter(typeof(string []), "args"); 

queue.Enqueue(Expression.Call(typeof(Console).GetMethod("WriteLine", new Type [] { }))); 

var block = Expression.Block(queue); 
var lambda = Expression.Lambda<Func<string [], int>>(block, new ParameterExpression [] { arguments }); 

lambda.CompileToMethod(builderMethod); 
// builderMethod is a MethodBuilder instance created earlier. 

ILGeneratorを使用してmicro-perfを必要としない状況では、これは非常に強力であり、確かに適しています。

関連する問題