Вызов частных конструкторов с помощью Reflection.Emit?

Я пытаюсь создать следующий IL:

LocalBuilder pointer = il.DeclareLocal(typeof(IntPtr));
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Stloc, pointer);
il.Emit(OpCodes.Ldloca, pointer);
il.Emit(OpCodes.Call, typeof(IntPtr).GetMethod("ToPointer"));
il.Emit(OpCodes.Ret);

Делегат, с которым я связываюсь, имеет подпись

void* TestDelegate(IntPtr ptr)

Он выдает исключение

Операция может дестабилизировать среду выполнения.

Кто-нибудь знает, что случилось?

РЕДАКТИРОВАТЬ: Хорошо, теперь у меня работает IL. Вся цель этого заключалась в том, чтобы иметь возможность вызывать частный конструктор. Частный конструктор принимает указатель, поэтому я не могу использовать обычное отражение. Теперь .. Когда я это называю, я получаю исключение, говорящее

Попытка метода ‹построенного метода› получить доступ к методу ‹частного конструктора› не удалась.

По-видимому, он выполняет проверки безопасности, но по опыту я знаю, что Reflection обычно может делать такие приватные вещи, так что, надеюсь, есть способ отключить эту проверку?


person jakobbotsch    schedule 24.12.2010    source источник
comment
Ваш IL выглядит нормально. Попробуйте записать его в сборку на диск (пройти через AssemblyBuilder); peverify расскажет вам, что не так.   -  person Tim Robinson    schedule 25.12.2010
comment
Очень странно. Если я использую AssemblyBuilder и генерирую все это, метод работает нормально. Если я использую DynamicMethod, он выдает это исключение, несмотря на то, что методы имеют одинаковый IL. Хм..   -  person jakobbotsch    schedule 25.12.2010
comment
Итак, теперь у меня работает IL. Я отредактировал свой пост с новым вопросом.   -  person jakobbotsch    schedule 25.12.2010
comment
отредактировал мой ответ, так как вы отредактировали вопрос. Из любопытства, что вам нужно было изменить, чтобы IL проверил?   -  person Ben Voigt    schedule 25.12.2010
comment
Я использовал AssemblyBuilder, ModuleBuilder, TypeBuilder и MethodBuilder. Когда я это сделал, все работало нормально, но с DynamicMethod (несмотря на то, что это была точно такая же инструкция IL) это могло дестабилизировать среду выполнения.   -  person jakobbotsch    schedule 25.12.2010


Ответы (1)


Обычно arg-0 является указателем this, а не IntPtr в вашем списке параметров.

РЕДАКТИРОВАТЬ: Чтобы ответить на ваш новый вопрос, вам нужно использовать один из других конструкторов DynamicMethod. Например, DynamicMethod Constructor (String, Type, Type[], Type) описывается как "логически связанный с типом. Эта ассоциация дает ему доступ к закрытым членам этого типа».

person Ben Voigt    schedule 24.12.2010
comment
И вам уже сказали об этом в ответ на ваш последний вопрос - person Ben Voigt; 25.12.2010
comment
Я не знаю, как динамический метод обрабатывает экземплярные/статические методы, но я считаю, что динамический метод является статическим методом и поэтому не имеет указателя this. Я понимаю, что не сказал, что это DynamicMethod - извините за это. - person jakobbotsch; 25.12.2010
comment
@Jakob: покажите свой код, который создает DynamicMethod, я думаю, какой конструктор вы используете, и список типов параметров, который вы передаете, могут быть важны для выяснения этого. - person Ben Voigt; 25.12.2010
comment
comment
@Ben: Когда я использовал этот конструктор, IL с DynamicMethod проходит проверку нормально. Теперь он должен работать. Спасибо! - person jakobbotsch; 25.12.2010