2010-07-31 11 views
6

En mis ensamblados .Net tendría que usar algunos dlls nativos (C++). Por lo general, necesitamos copiar los dlls de C++ en la carpeta bin y usar PInvoke para llamarlo. Para ahorrar el costo de distribución, quiero incorporar el C++ en mi .NET dll directo, de modo que la cantidad de ensamblados distribuidos sea menor.Incrustar bibliotecas C++ en .Net Libraries

¿Alguna idea de cómo hacer esto?

+0

posible duplicado de [Incrustar dll no administrado en un dll C# administrado] (http://stackoverflow.com/questions/666799/embedding-unmanaged-dll-into-a-managed-c-dll) –

+1

No estoy de acuerdo con el cierre como duplicado: las respuestas para la otra pregunta describen la parte "insertar como recursos" pero no cómo cargar correctamente las bibliotecas una vez que se han extraído al disco –

Respuesta

3

Incrustaría sus archivos DLL nativos como recursos.

Luego, en tiempo de ejecución, tendría que extraer esos archivos DLL nativos en una carpeta temporal; no necesariamente tiene acceso de escritura a la carpeta de la aplicación cuando se inicia la aplicación: piense en Windows Vista o Windows 7 y UAC. Como consecuencia, debe utilizar este tipo de código para cargarlos desde una ruta específica:

public static class NativeMethods { 

    [DllImport("kernel32")] 
    private unsafe static extern void* LoadLibrary(string dllname); 

    [DllImport("kernel32")] 
    private unsafe static extern void FreeLibrary(void* handle); 

    private sealed unsafe class LibraryUnloader 
    { 
    internal LibraryUnloader(void* handle) 
    { 
     this.handle = handle; 
    } 

    ~LibraryUnloader() 
    { 
     if (handle != null) 
     FreeLibrary(handle); 
    } 

    private void* handle; 

    } // LibraryUnloader 


    private static readonly LibraryUnloader unloader; 

    static NativeMethods() 
    { 
    string path; 

    // set the path according to some logic 
    path = "somewhere/in/a/temporary/directory/Foo.dll";  

    unsafe 
    { 
     void* handle = LoadLibrary(path); 

     if (handle == null) 
     throw new DllNotFoundException("unable to find the native Foo library: " + path); 

     unloader = new LibraryUnloader(handle); 
    } 
    } 
} 
+0

Si las extrae, ¿por qué necesita recorrer toda la ruta de LoadLibrary? ? – leppie

+0

para cargarlos desde una ruta específica, no necesariamente desde la misma ruta que el ejecutable de la aplicación –

0

Puede insertar sus dlls como recursos.

En tiempo de ejecución, extráigalos a la misma carpeta que su exe y use P/Invoke para llamar a métodos dentro de ellos.

+0

, no necesariamente tiene acceso de escritura a la carpeta de la aplicación cuando se inicia su aplicación: think windows vista o windows 7 y UAC –