SecurityException:必须将ECall方法打包到系统模块中

时间:2012-07-01 22:08:10

标签: c# clr securityexception

我有一个类似于以下的(C#)函数。

private static bool SpecialCase = false;

public void Foo()
{
    if (SpecialCase)
    {
        InternalMethod();
        return;
    }

    Console.WriteLine();
}

[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void InternalMethod();

当我在调试器内部使用.NET Framework 4执行此操作时,该方法成功地将空白行打印到控制台并返回。当我在调试器外部执行它时,它会抛出一个异常,并显示以下消息:

System.Security.SecurityException: ECall methods must be packaged into a system module.

当JIT编译器编译方法而不是调用(if)InternalMethod时,似乎抛出了异常。有什么我可以做的(例如属性)告诉CLI要么不抛出SecurityException,要么延迟异常直到实际调用该方法?

关于用例的附注:使用Microsoft .NET Framework运行时,SpecialCase字段实际上是错误的,而在CLI的不同(特定)实现下运行时,该字段为true。在Microsoft .NET Framework下运行时,对InternalMethod的调用实际上无法访问。

2 个答案:

答案 0 :(得分:2)

您可能需要查看compiler directives as a possible option。 与使用运行时" if"不同,这将确定调用是否完全包含在编译代码中,而不是始终将其编译到代码中并尝试确定是否在运行时调用它(根据你的分析,为时已晚)。

您的用例似乎是一种测试/验证方案,这意味着您不需要将其编译到代码中,除非实际进行内部调用。

请注意,如果您的用例涉及非.NET运行时,您应该提供更多信息,因为这可能会彻底改变正确的答案。

答案 1 :(得分:1)

将属性[ComImport]添加到您的类声明