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