我需要提前对一些发出的委托进行预 JIT,并尝试为此使用RuntimeHelpers.PrepareDelegate,但此方法标有该SecurityCritical
属性。我的程序集标有该AllowPartiallyTrustedCallers
属性,因此不能调用任何安全关键代码。
为什么PrepareDelegate
和PrepareMethod
安全至关重要,在预 JIT 处理这些代表时,我有哪些替代方案?
我需要提前对一些发出的委托进行预 JIT,并尝试为此使用RuntimeHelpers.PrepareDelegate,但此方法标有该SecurityCritical
属性。我的程序集标有该AllowPartiallyTrustedCallers
属性,因此不能调用任何安全关键代码。
为什么PrepareDelegate
和PrepareMethod
安全至关重要,在预 JIT 处理这些代表时,我有哪些替代方案?
正如 MSDN 文章CA2140 中所引用的:透明代码不得引用安全关键项:
如何解决违规问题
要修复违反此规则的行为,请执行以下操作之一:
SecurityCriticalAttribute
使用属性标记使用安全关键代码的代码元素- 或者 -
SecurityCriticalAttribute
从标记为安全关键的代码元素中删除该属性,并使用SecuritySafeCriticalAttribute
orSecurityTransparentAttribute
属性对其进行标记。
您必须使用[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);
}
}
}