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