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);
}
}
}
fonte
2010-07-31 09:21:02
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) –
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à –