動的メソッドがあり、実際のメソッド (Cecil を使用) からの byte[] があります。このバイト配列を動的メソッドに割り当てて実行するにはどうすればよいでしょうか。一方向だけではなく、バイト配列を呼び出す方法が必要だと確信しています。
4 に答える
そのためにはDynamicMethodを使用する必要があります。DynamicMethod.GetDynamicILInfo
コード、ローカル変数、および例外ハンドラーを使用して設定します。また、ILバイトバッファに表示されるトークンを修正する必要があります。次に、を使用して呼び出しますDynamicMethod.Invoke
。
最も些細な方法を除いて、これを達成することは簡単な作業ではありません。
まず、コピーせずに単にメソッドを呼び出してみませんか? それはあなたがやろうとしていることよりもずっと簡単なはずです。
基本的に、それはできません。これは、byte[]
他のアセンブリやメソッドなどを参照するメタデータ トークンが含まれているためです。そして、これらのトークンは、同じものを表している場合でも、アセンブリごとに異なります。そのため、別のアセンブリでを実行しようとするとbyte[]
、メタデータ トークンが完全に間違ったものになります。
を解析しbyte[]
て、それが表す IL 命令に変換し、それらを含む命令のメタデータ トークンを変換できますが、それを適切に行うには多くの作業が必要になる可能性があります。セシルがその手助けをしてくれると信じています。
別のオプションとして、すべてのメタデータ トークンを古いアセンブリから新しい動的アセンブリにコピーして、 のトークンbyte[]
が有効になるようにすることもできます。しかし、これがどれほど実現可能かはわかりません。
また、メソッドが非常に単純な場合 (メソッドが呼び出されず、カスタム タイプが使用されていない)、単にコピーするだけで機能するbyte[]
はずです。
それを実行することはできません。Cecil は優れたツールですが、実行時にメソッドごとに実行する必要があるコードには適していません。代わりに Reflection.Emit を使用する必要があります。
Cecil のメタデータ トークンの理解はランタイムのものとは完全に異なるため、提案された SetCode() メソッドはこのケースでは機能しないことに注意してください。そのため、ランタイムはトークンを解決する方法がありません (メソッド呼び出しなど)。