2

我有一个相当复杂的场景,我想创建一个附加到内存中 AssemblyBuilder 中的类的 DynamicMethod。动态方法在我的(常规)程序集中调用方法“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.

根据我的阅读,我的动态方法(上述错误中的 Max)是安全透明的,因为它附加到的程序集(AssemblyBuilder)是透明的。我猜 AssemblyBuilder 是透明的,因为它是一个动态程序集。

如何使我的动态方法变得至关重要,或者尽一切可能授予它调用 GetReplacement 的权限?我想在 GetReplacement 的程序集中调用其他几个方法,因此修复动态方法比以某种方式标记 GetReplacement 更好。

我有点迷路,希望得到一些帮助!

4

2 回答 2

1

在创建时,AssemblyBuilder您应该使用CustomAttributeBuilderSecurityCriticalAttribute分配给程序集。

一旦程序集被标记为安全关键,您可以将相同的属性添加到任何 DynamicMethod。

于 2010-07-14T15:11:34.470 回答
1

糟糕,这是我的一个错误。文档是正确的:动态方法从它所附加的类型继承其安全性。未附加到类型的方法附加到安全透明程序集。您不能将属性添加到覆盖安全性的 DynamicMethod ——您必须将其附加到适当的类型。

我犯了一个愚蠢的错误:查看附加到 AssemblyBuilder 的动态方法,而不是附加到 mscorlib 的动态方法(它是安全透明的)。

于 2010-07-15T09:37:00.100 回答