0

事前にいくつかの発行されたデリゲートを pre-JIT する必要があり、これにRuntimeHelpers.PrepareDelegateを使用しようとしましたが、このメソッドはSecurityCritical属性でマークされています。私のアセンブリはAllowPartiallyTrustedCallers属性でマークされているため、セキュリティ クリティカルなコードを呼び出すことができません。

なぜセキュリティが重要でPrepareDelegateありPrepareMethod、それらのデリゲートを事前に JIT する際にどのような代替手段がありますか?

4

1 に答える 1

2

MSDN の記事CA2140: Transparent code must not reference security critical itemsで参照されているように:

違反を修正する方法

この規則違反を修正するには、次のいずれかを実行します。

  • セキュリティ クリティカル コードを使用するコード要素をSecurityCriticalAttribute属性でマークします。

    - また -

  • SecurityCriticalAttributeセキュリティ クリティカルとしてマークされているコード要素から属性を削除し、代わりにor 属性でマークします。SecuritySafeCriticalAttributeSecurityTransparentAttribute

pre-JITing を実行するメソッドを でマークする必要があり[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 に答える