もっと怠け者になるために、同じコードを書いて同じことをしたいので、テストを行いました。いくつかの属性を使い、mon.cecilを使って.dllファイルにilコードを挿入したいだけです。そして、次の詳細である: これらをコーディングする場合:Mono.Cecilを使用すると、プロパティの自動実装されたバッキングフィールドが挿入されます
[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のインスタンスに設定されていません値)"。だから私にいくつかのヒントを与えることができる人がいる。
どのように注射しましたか?フィールドをクラスに正しく追加する必要があります。そうしないと、フィールドが機能しません。 –
@LexLi自動プロパティとして開始されたので、バッキングフィールドは既に存在します。 –