如何使我的DynamicMethod安全性至关重要?

时间:2010-07-14 15:00:47

标签: .net security clr dynamicmethod

我有一个相当复杂的场景,我想创建一个附加到内存中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要好。

我有点失落,很想得到一些帮助!

2 个答案:

答案 0 :(得分:1)

在创建AssemblyBuilder时,您应该使用CustomAttributeBuilder 为程序集分配SecurityCriticalAttribute

将程序集标记为Security-Critical后,您可以将相同的属性添加到任何DynamicMethod。

答案 1 :(得分:1)

哎呀,这对我来说是个错误。文档是正确的:动态方法从它所附加的类型继承其安全性。未附加到类型的方法将附加到安全透明程序集。您无法将属性添加到覆盖安全性的DynamicMethod - 您必须将其附加到适当的类型。

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