我有一个类似下面的(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
,要么延迟异常直到实际调用该方法?
关于使用案例的附注:当在Microsoft .NET Framework下运行时,SpecialCase
字段实际上为false,在不同(特定)实现的CLI下运行时为true。 在Microsoft .NET Framework下运行时,对InternalMethod
的调用实际上是无法访问的。
private static void InternalMethodWrapper() { InternalMethod(); }
- Sam Harwell.NET 4.5.2
上也会出现,但是在两个框架中(两个框架都有相同的CLR)只有在“Release”模式下才会出现,您考虑过在“Debug”模式下工作吗? - Tamir Vered