0

もっと怠け者になるには、コードを減らして同じことをしたいだけなので、テストを行いました。いくつかの属性を使用し、mono.cecil を使用して .dll ファイルに il コードを挿入したいだけです。詳細は次のとおりです。 これらをコーディングする場合:

[FillProperty("Counter")]
public int Counter
{
    get;
    set;
}

注入後、新しいコードが生成されます(ILSpyによる)(C#コード):

public int Counter
{
     [CompilerGenerated]
     get
     {
         return this.<Counter>k__BackingField;
     }
     [CompilerGenerated]
     set
     {
         if (this.<Counter>k__BackingField != value)
         {
             this.<Counter>k__BackingField = value;
             this.<Counter>k__BackingField.TriggerEvent("Counter");
         }
     }
}

定義コード:

`private int <Counter>k__BackingField;`

見えませんが、IL コードは問題ありません。

IL_0000: ldarg.0
IL_0001: ldfld int32 AssemblyTest::'<Counter>k__BackingField'
IL_0006: ldarg.1
IL_0007: beq IL_0023

IL_000c: ldarg.0
IL_000d: ldarg.1
IL_000e: stfld int32 AssemblyTest::'<Counter>k__BackingField'
IL_0013: ldarg.0
IL_0014: ldfld int32 AssemblyTest::'<Counter>k__BackingField'
IL_0019: ldstr "Counter"
IL_001e: callvirt void ['Assembly-CSharp']ExMethod::TriggerEvent<int32>(!!0, string)

IL_0023: ret

また、定義コードも問題ありません。

.field private int32 '<Counter>k__BackingField'
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
    01 00 00 00
)

しかし、挿入されたコードを実行すると、「NullReferenceException: オブジェクト参照がオブジェクト AssemblyTest.set_Counter (Int32 値) のインスタンスに設定されていません」という例外がスローされます。それで、私にいくつかのヒントを与えることができる人はいますか。

4

1 に答える 1

0

メソッドvoid ['Assembly-CSharp']ExMethod::TriggerEvent<int32>(!!0, string)は拡張メソッドであるため、 ですstatic。静的メソッドの呼び出しは、OpCodes.Call. に切り替えるCallvirtCall、問題が解決するはずです。

于 2016-06-16T17:01:15.047 に答える