web-dev-qa-db-ja.com

SecurityException:ECallメソッドをシステムモジュールにパッケージ化する必要があります

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

37
Sam Harwell

可能なオプションとしてコンパイラ指令 を確認することをお勧めします。実行時の「if」を使用する場合とは異なり、これは呼び出しを常にコードにコンパイルして実行時に呼び出すかどうかを決定しようとするのではなく、コンパイルされたコードに呼び出しが含まれているかどうかを判断します(遅すぎる) 、あなたの分析に基づいて)。

ユースケースはテスト/検証シナリオのように見えます。つまり、内部呼び出しが実際に行われる場合を除いて、コードにコンパイルする必要はありません。

ユースケースに.NET以外のランタイムが含まれる場合は、正解を大幅に変更する可能性があるため、より多くの情報を提供する必要があることに注意してください。

2
Matt Jordan

属性を追加[ComImport]クラス宣言へ

1
SkyFx