私は次のような(C#)関数を持っています。
private static bool SpecialCase = false;
public void Foo()
{
if (SpecialCase)
{
InternalMethod();
return;
}
Console.WriteLine();
}
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void InternalMethod();
デバッガー内で.NETFramework 4を使用してこれを実行すると、メソッドは空白行をコンソールに正常に出力して戻ります。デバッガーの外部で実行すると、次のメッセージとともに例外がスローされます。
System.Security.SecurityException: ECall methods must be packaged into a system module.
(if)InternalMethod
が呼び出されたときではなく、JITコンパイラがメソッドをコンパイルしたときに例外がスローされるようです。 SecurityException
をスローしないように、またはメソッドが実際に呼び出されるまで例外を遅らせるようにCLIに指示するためにできること(属性など)はありますか?
ユースケースに関する補足:SpecialCase
フィールドは、Microsoft .NET Frameworkで実行する場合は事実上falseであり、CLIの別の(特定の)実装で実行する場合はtrueです。 Microsoft .NET Frameworkで実行している場合、InternalMethod
の呼び出しには事実上到達できません。
可能なオプションとしてコンパイラ指令 を確認することをお勧めします。実行時の「if」を使用する場合とは異なり、これは呼び出しを常にコードにコンパイルして実行時に呼び出すかどうかを決定しようとするのではなく、コンパイルされたコードに呼び出しが含まれているかどうかを判断します(遅すぎる) 、あなたの分析に基づいて)。
ユースケースはテスト/検証シナリオのように見えます。つまり、内部呼び出しが実際に行われる場合を除いて、コードにコンパイルする必要はありません。
ユースケースに.NET以外のランタイムが含まれる場合は、正解を大幅に変更する可能性があるため、より多くの情報を提供する必要があることに注意してください。
属性を追加[ComImport]
クラス宣言へ