Программы выдают неверный код IL, но распознаются программным обеспечением для чтения IL - PullRequest
2 голосов
/ 11 июля 2020

Я изменяю свой код IL, заполнив поле с помощью get; устанавливать; методы, но во время выполнения он не работает при назначении. Я нашел страницу, а также точную строку, которая не работает. Вот он:

.method public hidebysig specialname instance void set_factionHumanSpawnLocation(valuetype Toolbox.Coord 'value') cil managed
{
    .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
    .maxstack 8
    L_0000: ldarg.0 
    L_0001: ldarg.1 
    L_0002: stfld valuetype Toolbox.Coord Targettier.Faction::<factionHumanSpawnLocation>k__BackingField
    L_0007: ldarg.0 
    L_0008: ldstr "factionHumanSpawnLocation"
    L_000d: ldnull 
    L_000e: ldarg.1 
    L_000f: call instance void Targettier.Faction::VariableListener(string, object, object)
    L_0014: ret 
}

Это call instance терпит неудачу. Я сделал явные требования, чтобы убедиться, что эта функция существует в процессе плетения. Кроме того, программное обеспечение позволяет мне переключать "видение" между кодом IL и кодом C#, и когда я нажимаю VariableListener name, оно с радостью перенаправляет меня туда, где находится эта функция. Это означает, что функция найдена, распознана и действительна. Но когда я нажимаю Play в Unity и присваиваю значение этому полю, он выдает следующее:

System.InvalidProgramException: Invalid IL code in [snip]: IL_000f: call 0x06000058

Я получаю тот же результат с обоими: VariableListener(string, object, object) и VariableListener(string, dynamic, dynamic) .

...