安全性异常:ECall 方法必须打包到系统模块中



我有一个类似于以下内容的(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,要么延迟异常,直到实际调用该方法?

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

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

您可能希望检查编译器指令作为可能的选项。与使用运行时"if"不同,这将确定调用是否包含在编译的代码中,而不是总是将其编译到代码中并尝试确定是否在运行时调用它(根据您的分析,为时已晚)。

您的用例看起来像一个测试/验证场景,这意味着您不需要将其编译到代码中,除非实际进行内部调用。

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

最新更新