2017-01-13 7 views
1

.NETでデバッグを使用してarroundを再生しています。 そして、私はdllからDynamicILInfoでメソッドを呼び出そうとしています。 しかし、私は間違って何をしていますか?DynamicILInfo呼び出しメソッド

 delegate void assinv1(); 
    private static void insert() 
    { 
     MethodInfo entryPoint = AppDomain.CurrentDomain.Load(File.ReadAllBytes(@"method.dll")).EntryPoint; 
     Type[] args = new Type[] { typeof(string[]) }; 
     DynamicMethod dm = new DynamicMethod("assinv", null, null); 
     DynamicILInfo dynamicILInfo = dm.GetDynamicILInfo(); 
     SignatureHelper localVarSigHelper = SignatureHelper.GetLocalVarSigHelper(); 
     localVarSigHelper.AddArguments(args, null, null); 
     dynamicILInfo.SetLocalSignature(localVarSigHelper.GetSignature()); 
     dynamicILInfo.SetCode(entryPoint.GetMethodBody().GetILAsByteArray(), entryPoint.GetMethodBody().MaxStackSize); 
     assinv1 d1 = dm.CreateDelegate(typeof(assinv1)) as assinv1; 
     d1(); 
    } 
    } 
+0

コードはどのように機能していませんか?何か例外がありますか?はいの場合、全体の例外を投稿できますか? – svick

+0

@Justus元のメソッドコードを表示します。そして、私はSetCode()にすべて電話しているのを見ていません。 –

+0

@svick何も情報なしの短い質問には申し訳ありません。この例外が発生します。「Common Language Runtimeが無効なプログラムを検出しました。」私もこの機能を編集しました。 OPを見てください。 –

答えて

0

あなたのアプローチの問題点は、アレイ内のバイトは、あなただけのどこから来ているアセンブリ内で有効なオペコードへの決意をコピーしているということです。

メソッドの呼び出しのオペコードは、そのメソッドの上位レベルのMethodInfoではなく、基本的にそのアセンブリ固有のメソッドテーブルのインデックスであるメタトークンを参照します。 2回コンパイルされた元のソースコードでも、トークンの値が異なる可能性があります。

これに対する解決策は、単純なコピーよりもはるかに複雑です。元のアセンブリでメタトークンを検索し、実行コンテキスト(現在のアセンブリ)で再解析する必要があります。

+0

彼のコメントのsvickが指摘したように、あなたが望むのが代理人であれば、反射を使うべきです。 –

関連する問題