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);
}
}
}
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) –
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 –