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

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

private static bool SpecialCase = false; public void Foo() { if (SpecialCase) { InternalMethod(); return; } Console.WriteLine(); } [MethodImpl(MethodImplOptions.InternalCall)] private static extern void InternalMethod(); 

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

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

当JIT编译器编译方法而不是调用(if) InternalMethod时,会出现exception。 有什么我能做的(例如属性)告诉CLI要么不抛出SecurityException ,要么延迟exception,直到实际调用方法?

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

您可能需要检查编译器指令作为可能的选项 。 与使用运行时“if”不同的是,这将决定调用是否包含在编译代码中,而不是总是将其编译到代码中,并试图确定是否在运行时调用它(这太迟了,根据你的分析)。

你的用例看起来像是一个testing/validation场景,这意味着你不需要将它编译到代码中,除非内部调用将被实际完成。

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

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