c# clr securityexception

c# - SecurityException: los métodos de ECall deben estar empaquetados en un módulo de sistema



clr (2)

Agregue el atributo [ComImport] a su declaración de clase

Tengo una función (C #) similar a la siguiente.

private static bool SpecialCase = false; public void Foo() { if (SpecialCase) { InternalMethod(); return; } Console.WriteLine(); } [MethodImpl(MethodImplOptions.InternalCall)] private static extern void InternalMethod();

Cuando ejecuto esto con .NET Framework 4 dentro del depurador, el método imprime con éxito la línea en blanco en la consola y regresa. Cuando lo ejecuto fuera del depurador, arroja una excepción con el siguiente mensaje:

System.Security.SecurityException: ECall methods must be packaged into a system module.

Parece que se lanza la excepción cuando el compilador JIT compila el método en lugar de cuando (si) se llama a InternalMethod . ¿Hay algo que pueda hacer (por ejemplo, atributos) para decirle a la CLI que no arroje SecurityException o que se demore la excepción hasta que se llame realmente el método?

Nota al SpecialCase sobre el caso de uso: El campo SpecialCase es efectivamente falso cuando se ejecuta con Microsoft .NET Framework, y es verdadero cuando se ejecuta bajo una implementación diferente (específica) de la CLI. Cuando se ejecuta bajo Microsoft .NET Framework, la llamada a InternalMethod es efectivamente inalcanzable.


Es posible que desee comprobar las directivas del compilador como una posible opción . A diferencia del uso de un "si" en tiempo de ejecución, esto determinará si la llamada se incluye en el código compilado, en lugar de compilarla siempre en el código y tratar de determinar si llamarla en el tiempo de ejecución (que es demasiado tarde). basado en su análisis).

Su caso de uso parece un escenario de prueba / validación, lo que significa que no lo necesita compilado en el código, excepto cuando se realice la llamada interna.

Tenga en cuenta que si su caso de uso implica un tiempo de ejecución que no sea .NET, debe proporcionar más información ya que esto podría cambiar drásticamente la respuesta correcta.