私が何かをしたいのなら、私は通常、期待されるコードMono.Cecil
でクラス/メソッドを作成します。C#
次に、を使用して検査し(リリースモードで実行していることを確認します)Mono.Cecil
、再作成します。
したがって、とパラメータが必要MethodDefinition
になります。名前:「f」name
attributes
returnType
メソッドの属性は次のようになります。Mono.Cecil.MethodAttributes.FamANDAssem | Mono.Cecil.MethodAttributes.Family | Mono.Cecil.MethodAttributes.Static | Mono.Cecil.MethodAttributes.HideBySig
そして、戻り型(としての型Mono.Cecil.TypeReference
のSystem.Double
)
パラメータに関しては、2つParameterDefinition
追加できますtarget.Parameters.Add()
パラメータの1つにデフォルト値があるため、その属性は次のように設定する必要がMono.Cecil.ParameterAttributes.Optional | Mono.Cecil.ParameterAttributes.HasDefault
あります(あなたの場合)Constant
1.0
次に、メソッド本体について:
target.Body.GetILProcessor(); // target is your `MethodDefinition` object.
からの指示target.Body.Instructions
を調べると、次のコードが表示されます。
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: mul
IL_0003: stloc.0
IL_0004: br.s IL_0007
IL_0005: ldloc.0
IL_0007: ret
したがって、正しい順序でコードを追加するだけです
processor.Append(OpCodes.Ldarg_0);
その後MethodDefinition
、それぞれのアセンブリにを注入/保存します。
私のアセンブリインスペクターコードは次のようになります。
private static void EnumerateAssembly(AssemblyDefinition assembly)
{
foreach (var module in assembly.Modules)
{
foreach (var type in module.GetAllTypes())
{
foreach (var field in type.Fields)
{
Debug.Print(field.ToString());
}
foreach (var method in type.Methods)
{
Debug.Print(method.ToString());
foreach (var instruction in method.Body.Instructions)
{
Debug.Print(instruction.ToString());
}
}
}
}
}