2012-01-26 20 views
6

Esta question me inspiró a hacer la siguiente pregunta. El atributo DllImport siempre carga el DLL específico incluso cuando no está llamando/usando el método.El atributo DllImport siempre carga la DLL no administrada

Por ejemplo cuando se tiene el siguiente código:

static class Program { 

    [DllImport("kernel32.dll")] 
    static extern bool AllocConsole(); 

    static void Main() 
    { 
     if (true)         
     { 
      //do some things, for example starting the service. 
     } 
     else 
     { 
      AllocConsole(); 
     }   
    }   
} 

Ahora, cuando se inicia la aplicación del AllocConsole nunca será despedido sino que la DLL cargar todos modos?

+1

¿Qué ocurre si lo cambia a '[DllImport (" kernel99.dll ")]'? Suponiendo que no tienes uno de esos, por supuesto. Si no hay ningún error, supongo que no intentó cargarlo. – Blorgbeard

Respuesta

4

A medida que el MSDN dice:

Localización y cargar el archivo DLL, y la localización de la dirección de la función en la memoria ocurrir sólo en la primera llamada a la función.

Pero puede verificarlo fácilmente especificando un dll inexistente en el atributo.

3

Hice una pequeña prueba. El siguiente programa funciona muy bien:

static class Program { 
    [DllImport("doesnotexist.dll")] 
    static extern bool AllocConsole(); 
    static void Main() { 
     if (false) AllocConsole(); 
    }   
} 

el siguiente programa plantea una DllNotFoundException en la línea AllocConsole().

static class Program { 
    [DllImport("doesnotexist.dll")] 
    static extern bool AllocConsole(); 
    static void Main() { 
     if (true) AllocConsole(); 
    }   
} 

Parece que el dll solo se carga cuando se lo llama por primera vez.

+0

+1 Para verificarlo. –

Cuestiones relacionadas