0

我需要提前对一些发出的委托进行预 JIT,并尝试为此使用RuntimeHelpers.PrepareDelegate,但此方法标有该SecurityCritical属性。我的程序集标有该AllowPartiallyTrustedCallers属性,因此不能调用任何安全关键代码。

为什么PrepareDelegatePrepareMethod安全至关重要,在预 JIT 处理这些代表时,我有哪些替代方案?

4

1 回答 1

2

正如 MSDN 文章CA2140 中所引用的:透明代码不得引用安全关键项

如何解决违规问题

要修复违反此规则的行为,请执行以下操作之一:

  • SecurityCriticalAttribute使用属性标记使用安全关键代码的代码元素

    - 或者 -

  • SecurityCriticalAttribute从标记为安全关键的代码元素中删除该属性,并使用SecuritySafeCriticalAttributeor SecurityTransparentAttribute属性对其进行标记。

您必须使用[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);
        }
    }
}
于 2013-02-19T12:15:14.947 回答