SecurityException: Metody ECall muszą być spakowane do modułu systemowego
Mam funkcję (C #) podobną do następującej.
private static bool SpecialCase = false;
public void Foo()
{
if (SpecialCase)
{
InternalMethod();
return;
}
Console.WriteLine();
}
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void InternalMethod();
Kiedy wykonuję to za pomocą .NET Framework 4 wewnątrz debugera, metoda z powodzeniem drukuje pusty wiersz do konsoli i zwraca. Kiedy wykonuję go poza debuggerem, zgłasza wyjątek z następującym komunikatem:
System.Security.SecurityException: ECall methods must be packaged into a system module.
Wygląda na to, że wyjątek jest generowany, gdy kompilator JIT kompiluje metodę, a nie gdy (if)InternalMethod
jest nazywany. Czy jest coś, co mogę zrobić (np. Atrybuty), aby poinformować CLI, aby nie rzucałSecurityException
lub opóźnij wyjątek, dopóki metoda nie zostanie faktycznie wywołana?
Uwaga dodatkowa dotycząca przypadku użycia: TheSpecialCase
pole jest faktycznie fałszywe, gdy działa z Microsoft .NET Framework, a true, gdy działa w innej (specyficznej) implementacji CLI. W przypadku korzystania z Microsoft .NET Framework wywołanie doInternalMethod
jest nieosiągalny.