Как я могу сделать мой DynamicMethod критичным для безопасности? - PullRequest
2 голосов
/ 14 июля 2010

У меня довольно запутанный сценарий, в котором я хочу создать DynamicMethod, который присоединяется к классу в AssemblyBuilder в памяти.Динамический метод вызывает метод «GetReplacement» в моей (обычной) сборке.

Это нормально работало в .NET 2.0, но в .NET 4.0 я получаю ошибку:

MethodAccessException: Attempt by security transparent method 'DynamicClass.Max(Int32, Int32)' 
to access security critical method 'xxx.GetReplacement()' failed.

Из того, что я прочитал, мой динамический метод (Макс в ошибке выше) прозрачен для безопасности, потому что сборка, к которой он присоединен (AssemblyBuilder), прозрачна.Я предполагаю, что AssemblyBuilder прозрачен, потому что это динамическая сборка.

Как мне сделать мой динамический метод критическим или сделать все возможное, чтобы предоставить ему разрешение на вызов GetReplacement?Есть несколько других методов, которые я хочу вызвать в сборке GetReplacement, поэтому исправление динамического метода было бы лучше, чем пометка GetReplacement в некотором роде.

Я немного растерялся и хотел бы помочь!

Ответы [ 2 ]

1 голос
/ 15 июля 2010

Упс, это была ошибка с моей стороны.Документы верны: динамический метод наследует свою безопасность от типа, к которому он подключен.Методы, которые вы не прикрепляете к типу, прикрепляются к прозрачной сборке безопасности.Вы не можете добавить атрибут к DynamicMethod, переопределяющий безопасность - вы должны присоединить его к соответствующему типу.

Я совершил глупую ошибку: смотрел на динамический метод, прикрепленный к AssemblyBuilder, а неодин подключен к mscorlib (прозрачный для безопасности).

1 голос
/ 14 июля 2010

При создании AssemblyBuilder вы должны использовать CustomAttributeBuilder , чтобы назначить SecurityCriticalAttribute для сборки.

После того, как сборка помечена как критическая, вымог добавить тот же атрибут к любому DynamicMethod.

...