我有一个类似于以下的(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
的调用实际上无法访问。
答案 0 :(得分:2)
您可能需要查看compiler directives as a possible option。 与使用运行时" if"不同,这将确定调用是否完全包含在编译代码中,而不是始终将其编译到代码中并尝试确定是否在运行时调用它(根据你的分析,为时已晚)。
您的用例似乎是一种测试/验证方案,这意味着您不需要将其编译到代码中,除非实际进行内部调用。
请注意,如果您的用例涉及非.NET运行时,您应该提供更多信息,因为这可能会彻底改变正确的答案。
答案 1 :(得分:1)
将属性[ComImport]
添加到您的类声明