I have a native DLL which comes in both 32 bit and 64 bit versions (x86). I want to create a wrapper which works on both architectures (Any CPU) and loads the correct versio
Here is the solution I've used on many projects:
Here is how I declare P/Invoke methods:
[DllImport("MyAssembly.Native.x86.dll", EntryPoint = "MyTest")]
private static extern void MyTest86(MyType myArg);
[DllImport("MyAssembly.Native.x64.dll", EntryPoint = "MyTest")]
private static extern void MyTest64(MyType myArg);
And here is the corresponding 'MyTest' function which is the one I'll always use (the others are here just for correct bitness binding). It has the same signature than the other P/Invoke ones:
public static void MyTest(MyType myArg)
{
if (IntPtr.Size == 8)
{
MyTest64(myArg);
return;
}
MyTest86(myArg);
}
The advantages are:
The inconveniences are:
Take a look at the Microsoft.WinAny.Helper and It'a DynamicNativeLibrary class which can help you with what you need.
The way I do it is to p/invoke a call to LoadLibrary
before calling any of the p/invokes to the library.
LoadLibrary
to load it passing the full path to the DLL.This relies on the unmanaged DLL having the same name for both 32 and 64 bit. If that's not the case then you are in trouble. In that scenario you may need to bind explicitly to the DLL by p/invoking GetProcAddress
. This is no fun at all. Or you implement the sort of scaffolding that Simon describes in his answer.