Здравствуйте, Sinclair, Вы писали:
S>А вот если мы попробуем такой же MSIL сгенерировать в рамках DynamicMethod, то попытка вызвать его приведёт к InvalidOperationException "This operation could destabilize the runtime".
S>В чём может быть дело?
код выглядит нормально,
ilg.Emit(OpCodes.Ldc_I4_1); // 1 1
ilg.Emit(OpCodes.Newarr, typeof(int)); // 1 int[1]
ilg.Emit(OpCodes.Stloc, t); // 0
ilg.Emit(OpCodes.Ldloc, t); // 1 int[1]
ilg.Emit(OpCodes.Ldc_I4_0); // 2 int[1], 0
ilg.Emit(OpCodes.Ldelema, typeof(int)); // 1 &int[0]
ilg.Emit(OpCodes.Conv_U); // 1 &int[0]
ilg.Emit(OpCodes.Stloc, p); // 0
ilg.Emit(OpCodes.Ldloc, p); // 1 &int[0]
ilg.Emit(OpCodes.Ldc_I4_M1); // 2 &int[0], -1
ilg.Emit(OpCodes.Stind_I4); // 0
ilg.Emit(OpCodes.Ret);
}
Похоже, что дело в permission-ах. Долгое объяснение —
https://docs.microsoft.com/en-us/dotnet/framework/reflection-and-codedom/security-issues-in-reflection-emit
Я не помню точно, есть ли способ отрубить все проверки, но может помочь параметр restrictedSkipVisibility + привязка к модулю в конструкторе DynamicMethod.
Также см
https://www.codeproject.com/Answers/494914/Can-tplusfigureplusoutpluswhyplusthisplusDynamic#answer2
https://stackoverflow.com/a/13432022
https://docs.microsoft.com/en-us/dotnet/api/system.reflection.emit.dynamicmethod?view=netframework-4.7.2