RuntimeHelpers.PrepareDelegate的安全透明备选方案

问题描述:

我需要提前预先发送一些发出的代表,并尝试使用RuntimeHelpers.PrepareDelegate进行此操作,但此方法标记为SecurityCritical属性。我的程序集标有AllowPartiallyTrustedCallers属性,因此不能调用任何安全关键代码。RuntimeHelpers.PrepareDelegate的安全透明备选方案

为什么PrepareDelegatePrepareMethod安全至关重要,在替代这些代表之前我有什么替代方案?

+0

您是否尝试过标记用'[SecuritySafeCritical]'执行pre-JITing的方法? – 2013-02-19 11:59:53

由于MSDN文章CA2140: Transparent code must not reference security critical items中引用:

如何解决冲突

要修复与该规则的冲突,请执行下列操作之一:

  • 马克使用安全关键代码的代码元素与SecurityCriticalAttribute属性

    - 或 -

  • 从被标记为安全关键的,并且代替标记它们 与SecuritySafeCriticalAttributeSecurityTransparentAttribute属性的代码元素取出SecurityCriticalAttribute属性。

你必须标记,做预JIT编译与[SecuritySafeCriticalAttribute]的方法。在这里它是在行动:

using System; 
using System.Runtime.CompilerServices; 
using System.Reflection; 
using System.Security; 

[assembly: AllowPartiallyTrustedCallers] 
namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      PreJIT(); 
     } 

     [SecuritySafeCritical] 
     static void PreJIT() 
     { 
      RuntimeHelpers.PrepareMethod(
       System.Reflection.Emit.DynamicMethod.GetCurrentMethod() 
       .MethodHandle); 
     } 
    } 
} 
+0

进一步说明:您可以添加SecuritySafeCritical属性*,因为*程序集是APTCA。如果它是透明的,那么你将无法获得安全的关键代码。 – fsimonazzi 2013-03-14 18:36:52