抛出:SecurityException:紧急呼叫的方法必须打包到系统模块(SecurityExce

2019-06-25 23:29发布

我有类似以下内容的(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编译器编译的方法,而不是当(如果)将抛出异常InternalMethod被调用。 有什么我可以做(例如属性)告诉CLI要么不扔SecurityException ,或延迟异常,直到该方法实际上是叫什么名字?

于使用情况,侧面说明:本SpecialCase根据不同的(特定)实施CLI的运行时的Microsoft .NET Framework中运行时,和真正的现场是有效错误。 当在Microsoft .NET Framework的运行,调用InternalMethod实际上是不可达。

Answer 1:

您可能要检查的编译器指令作为一个可能的选项 。 与使用运行时“如果”,这将确定呼叫是否包含在编译后的代码在所有的,而不是总是将其编译到代码,并试图确定是否调用它在运行时(这是为时已晚根据您的分析)。

您的使用情况似乎是一个测试/验证的情况下,这意味着你不需要它编译成代码除了当内部通话将实际进行做。

请注意,如果您的用例涉及non-.NET运行时,你应该提供更多的信息,因为这可能极大地改变了正确的答案。



Answer 2:

添加属性[ComImport]你的类声明



文章来源: SecurityException: ECall methods must be packaged into a system module