Re: Можно ли генерировать Unsafe код в DynamicMethod?
От: Sinix  
Дата: 21.06.18 10:25
Оценка: 70 (2)
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.