2016-05-16 6 views
0

もっと怠け者になるために、同じコードを書いて同じことをしたいので、テストを行いました。いくつかの属性を使い、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のインスタンスに設定されていません値)"。だから私にいくつかのヒントを与えることができる人がいる。

+0

どのように注射しましたか?フィールドをクラスに正しく追加する必要があります。そうしないと、フィールドが機能しません。 –

+0

@LexLi自動プロパティとして開始されたので、バッキングフィールドは既に存在します。 –

答えて

0

メソッドvoid ['Assembly-CSharp']ExMethod::TriggerEvent<int32>(!!0, string)は拡張メソッドなので、staticです。静的メソッドへの呼び出しは、OpCodes.Callを使用して行われます。スイッチCallvirtCallを入力してください。問題が解決するはずです。

+0

ありがとう、私は後者をテストします。 – Wayland

関連する問題