Is there a way to have the particular DLL referenced by a P/Invoke (DllImport) signature depend on the CPU architecture?
I\'m working on an application that loads a
"If instead of different DLL names it was the same name in different folders, does that open any other options?"
Maybe this would work for you:
public static class NativeMethods
{
// here we just use "Foo" and at runtime we load "Foo.dll" dynamically
// from any path on disk depending on the logic you want to implement
[DllImport("Foo", EntryPoint = "bar")]
private void bar();
[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;
if (IntPtr.Size == 4)
path = "path/to/the/32/bit/Foo.dll";
else
path = "path/to/the/64/bit/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);
}
}
}
It consists in explicitly loading the native library with its full path before P/Invoke itself tries to load it.
What do you think?