Ответ 1
Это прежде всего проблема развертывания, просто попросите установщика скопировать нужную DLL на основе версии Windows на целевой машине.
Но никто никогда не любит это делать. Динамически вызывать правильную функцию DLL чрезвычайно тяжело, вам нужно писать типы делегатов для каждой экспортируемой функции и использовать LoadLibrary + GetProcAddress + Marshal.GetDelegateForFunctionPointer для создания объекта делегирования.
Но никто никогда не любит это делать. Менее болезненным является объявление функции дважды, присвоение ей разных имен и использование свойства EntryPoint в атрибуте [DllImport] для указания реального имени. Затем проверьте во время выполнения, которое вы хотите вызвать.
Но никто никогда не любит это делать. Самый эффективный трюк - это заставить Windows загружать нужную DLL для вас. Первое, что вам нужно сделать, это скопировать DLL в каталог, где Windows не будет искать его. Лучший способ - создать подкаталог "x86" и "x64" в каталоге сборки и скопировать соответствующую DLL в каждую. Сделайте это, написав событие post-build, которое создает каталоги и копирует библиотеки DLL.
Затем скажите Windows об этом, выведя SetDllDirectory(). Указанный вами путь будет добавлен в каталоги, которые Windows ищет в DLL. Вот так:
using System;
using System.Runtime.InteropServices;
using System.Reflection;
using System.IO;
class Program {
static void Main(string[] args) {
var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
path = Path.Combine(path, IntPtr.Size == 8 ? "x64" : "x86");
bool ok = SetDllDirectory(path);
if (!ok) throw new System.ComponentModel.Win32Exception();
//etc..
}
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool SetDllDirectory(string path);
}
Учтите, действительно ли полезен для вас код, выполняющийся в 64-битном режиме. Довольно редко требуется огромное виртуальное адресное пространство виртуальной памяти, которое вы получаете от него, единственное реальное преимущество. Вам все равно необходимо поддерживать 32-разрядную версию, которая должна работать правильно в случае с 2 гигабайтами.