残念ながら例外を飲み込むサードパーティのアセンブリを使用しているため、Mono.Cecil を使用してアセンブリを書き直すことにしました (幸いなことに、強く型付けされていません) (DI と AOP の調査後にこの宝石を発見しました)。できるだけ多くの情報を見つけようとしましたが、IL の構成に関してまだいくつか質問があります。
私はすでにこれとこれを読んでいるので、何をする必要があるかがわかりますが、前述のように、呼び出しを行うための適切な IL を生成する方法がわかりません。
Cecil を使用して、単純な try/catch を実行しているメソッドから命令を抽出しました -> Elmah にログイン -> 例外を続行させます。これが注入する必要があります。
これは私が複製しようとしているキャッチです:
catch (Exception ex)
{
Elmah.ErrorLog.GetDefault(System.Web.HttpContext.Current)
.Log(new Elmah.Error(ex));
throw;
}
これらは、Cecil を使用して取得した catch ブロックの命令です。
IL_010d: stloc.s V_7
IL_010f: nop
IL_0110: call System.Web.HttpContext System.Web.HttpContext::get_Current()
IL_0115: call Elmah.ErrorLog Elmah.ErrorLog::GetDefault(System.Web.HttpContext)
IL_011a: ldloc.s V_7
IL_011c: newobj System.Void Elmah.Error::.ctor(System.Exception)
IL_0121: callvirt System.String Elmah.ErrorLog::Log(Elmah.Error)
IL_0126: pop
IL_0127: rethrow
IL_0129: nop
Cecil を使用してこのブロックを複製しようとしています。
var currentHttpContextInstruction = ilProcessor.Create(OpCodes.Call, module.Import(typeof(System.Web.HttpContext).GetProperty("Current").GetGetMethod()));
var elmahGetDefaultInstruction = ilProcessor.Create(OpCodes.Call, module.Import(typeof(Elmah.ErrorLog).GetMethod("GetDefault")));
var instantiateElmahErrorInstruction = ilProcessor.Create(OpCodes.Newobj, module.Import(typeof(Elmah.Error).GetConstructor(new[] { typeof(System.Exception) })));
var elmahErrorLogInstruction = ilProcessor.Create(OpCodes.Callvirt, module.Import(typeof(Elmah.ErrorLog).GetMethod("Log")));
var rethrowInstruction = ilProcessor.Create(OpCodes.Rethrow);
よくわからないのは、残りの命令を正しく複製する方法です...
を作成してnew VariableDefinition
追加しmethod.Body.Variables
、その変数に対してstloc
and操作を実行するだけですか? とコマンドはどうですかldloc
?この質問で提起された問題について心配する必要がありますか?nop
pop
これを正しい方法で行う方法についてのガイダンスは大歓迎です!
コマンドの意味を調べたので、私の質問はコマンドの意味に関するものではないことに注意してください。