Используйте Mono.Cecil, чтобы внедрить автоматически реализованное поле поддержки свойства

Чтобы быть более ленивым, я просто хочу писать меньше кода, но делаю то же самое, поэтому я сделал тест. Просто хотите использовать какой-нибудь атрибут и использовать 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)". Так есть ли кто-нибудь, кто может дать мне несколько советов.

1 ответ

Метод void ['Assembly-CSharp']ExMethod::TriggerEvent<int32>(!!0, string) это метод расширения, поэтому он static, Вызовы статических методов осуществляются с использованием OpCodes.Call, переключатель Callvirt в Call и это должно исправить вашу проблему.

Другие вопросы по тегам