代码之家  ›  专栏  ›  技术社区  ›  Steven

RuntimeHelpers.PrepareDelegate的安全透明替代方案

  •  0
  • Steven  · 技术社区  · 13 年前

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

    为什么 PrepareDelegate PrepareMethod 安全至关重要,他们有什么替代方案?我在预先任命这些代表时有哪些替代方案?

    1 回复  |  直到 13 年前
        1
  •  2
  •   Alex Filipovici    13 年前

    如MSDN文章中所述 CA2140: Transparent code must not reference security critical items :

    如何修复违规

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

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

      -或-

    • 移除 安全关键属性 标记为安全关键的代码元素的属性,而不是 标记它们 与 SecuritySafeCriticalAttribute 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);
            }
        }
    }