C# RuntimeHelpers.PrepareDelegate的安全透明替代方案
我需要提前预JIT一些发出的委托,并尝试为此使用,但此方法标记为C# RuntimeHelpers.PrepareDelegate的安全透明替代方案,c#,.net,code-access-security,C#,.net,Code Access Security,我需要提前预JIT一些发出的委托,并尝试为此使用,但此方法标记为SecurityCritical属性。我的程序集被标记为AllowPartiallyTrustedCallers属性,因此不能调用任何安全关键代码 为什么PrepareDelegate和preparedemethod安全性至关重要,我在预JITting这些代理时有哪些备选方案?如MSDN文章所述: 如何纠正违规行为 要修复违反此规则的情况,请执行以下操作之一: 使用SecurityCriticalAttribute属性标记使用安全
SecurityCritical
属性。我的程序集被标记为AllowPartiallyTrustedCallers
属性,因此不能调用任何安全关键代码
为什么
PrepareDelegate
和preparedemethod
安全性至关重要,我在预JITting这些代理时有哪些备选方案?如MSDN文章所述:
如何纠正违规行为
要修复违反此规则的情况,请执行以下操作之一:
- 使用
属性标记使用安全关键代码的代码元素 -或-SecurityCriticalAttribute
- 从标记为安全关键的代码元素中删除
属性,改为标记它们 使用安全性安全关键属性或SecurityCriticalAttribute
属性SecurityTransparentAttribute
[SecuritySafeCriticalAttribute]
标记进行预JIT的方法。这就是它的作用:
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);
}
}
}
您是否尝试过使用
[SecuritySafeCritical]
标记进行预JIT的方法?进一步说明:您可以添加该SecuritySafeCritical属性,因为程序集是APTCA。如果它是透明的,那么您就不能拥有安全的关键代码。