Это в первую очередь проблема развертывания, когда выбираются правильные библиотеки DLL для соответствующей операционной системы. Довольно просто, если вы создадите два проекта установки, один для x86, а другой для x64.
Также возможно сделать это прозрачным. Например, вы должны создать подкаталог x86 и x64 в каталоге, в котором находится ваш EXE-файл, и поместить соответственно 32-битную и 64-битную сборки DLL в эти подкаталоги. При запуске, проверьте IntPtr.Size, чтобы знать битность вашего процесса. Затем, соответственно, вызовите SetDllDirectory, чтобы Windows нашла правильную DLL. Как это:
using System.Runtime.InteropServices;
using System.Reflection;
using System.IO;
...
public static void SetupDllDirectory() {
string path = Assembly.GetEntryAssembly().Location;
path = Path.Combine(path, IntPtr.Size == 8 ? "x64" : "x86");
bool ok = SetDllDirectory(path);
if (!ok) throw new System.ComponentModel.Win32Exception();
}
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetDllDirectory(string path);
Используйте событие после сборки, чтобы скопировать библиотеки DLL. Использование Environment.SetEnvironmentVariable () для добавления каталога в переменную среды PATH - это еще один подход.