次のような(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.
InternalMethod
(if)が呼び出されたときではなく、JIT コンパイラがメソッドをコンパイルしたときに例外がスローされたようです。SecurityException
メソッドが実際に呼び出されるまで例外をスローしないようにするか、例外を遅らせるように CLI に指示するためにできること (属性など) はありますか?
ユース ケースに関する補足: このSpecialCase
フィールドは、Microsoft .NET Framework で実行している場合は事実上 false であり、CLI の別の (特定の) 実装で実行している場合は true です。Microsoft .NET Framework で実行している場合、への呼び出しInternalMethod
は事実上到達できません。