2010-07-31 13 views
6

Nei miei .Net assembly dovrei fare uso di alcune DLL native (C++). Di solito abbiamo bisogno di copiare le DLL C++ nella cartella bin e usare PInvoke per chiamarlo. Per salvare il costo di distribuzione, voglio incorporare il C++ nel mio .Net dll direct, in modo che il numero di assembly distribuiti sia inferiore.Incorpora librerie C++ in librerie .Net

Qualche idea su come procedere?

+0

possibile duplicato di [Incorporamento di dll non gestito in un dll C# gestito (http://stackoverflow.com/questions/666799/embedding-unmanaged-dll-into-a-managed-c-dll) –

+1

non sono d'accordo con la chiusura come duplicato - le risposte per l'altra domanda descrivono la parte "embed as resources" ma non come caricare correttamente le librerie una volta che sono state estratte nell'unità –

risposta

3

Incorporate le vostre DLL native come risorse.

Quindi in fase di esecuzione, è necessario estrarre quelle DLL native in una cartella temporanea; non hai necessariamente accesso in scrittura alla cartella dell'applicazione all'avvio dell'applicazione: pensa a windows vista o windows 7 e UAC. Di conseguenza, si utilizzerà questo tipo di codice per caricarli da un percorso specifico:

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

Se le estrai, perché devi percorrere l'intera rotta LoadLibrary ? – leppie

+0

per caricarli da un percorso specifico, non necessariamente dallo stesso percorso dell'eseguibile dell'applicazione –

0

È possibile incorporare le DLL come risorse.

In fase di esecuzione, estraili nella stessa cartella del tuo exe e usa P/Invoke per chiamare i metodi al loro interno.

+0

, non è necessario avere accesso in scrittura alla cartella dell'applicazione all'avvio dell'applicazione: si pensi a windows vista o windows 7 e UAC –