2009-09-29 3 views
12

При генерации IL с помощью DynamicMethod это можно назвать методы и поля доступа, которые были бы в противном случае не-доступны, если вы предоставите «истина» для параметра restrictedSkipVisibility в DynamicMethod constructorМожно ли пропускать проверки видимости при генерации динамического IL с помощью метода MethodBuilder?

Я бы предпочел, чтобы излучать динамический IL в динамическую сборку вместо этого я могу сохранить сгенерированный IL в сборку во время сборки. Если я использую этот метод, я должен использовать MethodBuilder вместо DynamicMethod. Однако мне нужно пропустить проверки видимости, поэтому я не получаю MethodAccessException, когда запускаю свой динамический код. Есть ли способ сделать это, и если да, то как?

+0

Решена ли эта проблема? Можете ли вы вкратце описать, как вы его решили? – kizzx2

+0

Нет. Насколько я могу судить, оно не разрешимо. В итоге я решил использовать другой подход к решению, используя библиотеку Mono.Cecil для повторной записи сборки. Таким образом, я мог бы получить доступ к частным или внутренним членам без нарушения правил безопасности. Тем не менее, с помощью этого метода я не смог правильно совместить символы с исходными файлами, что вызвало другие неприятности. –

ответ

2

При использовании MethodBuilder в динамических сборках вы привязаны к тем же правилам, что и сборщики, сгенерированные компилятором. Таким образом, видимость между сборками регулируется:

Просьба ознакомиться с документацией и образцами, чтобы узнать, может ли она соответствовать вашим потребностям.

0

Если вам нужно материализовать свой сгенерированный код с помощью интерфейса вместо делегирования, il будет полезен для прокруткиVisibilityCheck для Methodbuilder. Я не нашел способ сделать это напрямую, но вы можете просто вызвать DynamicMethod в свой MethodBuilder с помощью EmitCalli (OpCodes.Calli ...).