38

次のような(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は事実上到達できません。

4

2 に答える 2

1

[ComImport]クラス宣言に属性を追加します

于 2015-11-19T00:59:21.973 に答える