У меня есть функция (С#), аналогичная следующей.
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.
Похоже, что исключение возникает, когда компилятор JIT компилирует метод, а не когда (if) InternalMethod
вызывается. Есть ли что-нибудь, что я могу сделать (например, атрибуты), чтобы сообщить CLI либо не выкидывать SecurityException
, либо задерживать исключение до тех пор, пока фактически не будет вызван метод?
Боковое примечание в прецеденте: поле SpecialCase
является фактически ложным при работе с Microsoft.NET Framework и истинно при работе под другой (конкретной) реализацией CLI. При работе в Microsoft.NET Framework вызов InternalMethod
является недоступным.