Это рабочее решение вашей проблемы:
Добавьте 2 DLL (x86 и x64) к вашему решению в подпапке.Сделайте их «Копировать, если новее»
Ссылка на правильную DLL, которую вы используете для разработки для отладки из 2 добавленных вами DLL.Make it Copy Local = false.
Это означает, что при запуске приложения DLL не загружается автоматически.Он не будет загружен, пока вы не используете тип из этой сборки.Как только это произойдет, в .Net будет запущено событие, которое спросит, где он может найти вашу сборку.
Поэтому перед первым использованием этой сборки убедитесь, что вы подключились к этому событию.
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
В содержимом обработчика убедитесь, что вы загружаете DLL (x86 или x64), когда он запрашивает ее.
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
if (args.Name.Equals("MyFullAssemblyName")) {
var path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
if (IntPtr.Size > 4) {
var dll = System.IO.Path.Combine(path, @"MySubDir\MyDLL_x64.dll");
return System.Reflection.Assembly.LoadFile(dll);
}
else {
var dll = System.IO.Path.Combine(path, @"MySubDir\MyDLL.dll");
return System.Reflection.Assembly.LoadFile(dll);
}
}
return null;
}
Вуаля.Теперь вы можете запускать ваше приложение как 32-битное, так и 64-битное.
В качестве альтернативы добавлению библиотек DLL во вложенную папку вы можете сделать их встроенными ресурсами, а затем загрузить их следующим образом:
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
if (args.Name.Equals("MyFullAssemblyName")) {
var ass = Assembly.GetExecutingAssembly();
if (IntPtr.Size > 4) {
var strm = ass.GetManifestResourceStream("the.resource.name.for.MyDLL_x64.dll");
var data = new byte[strm.Length];
strm.Read(data, 0, data.Length);
return Assembly.Load(data);
}
else {
var strm = ass.GetManifestResourceStream("the.resource.name.for.MyDLL.dll");
var data = new byte[strm.Length];
strm.Read(data, 0, data.Length);
return Assembly.Load(data);
}
}
return null;
}
Это работает не для всех сборок.Некоторые «гибридные» сборки могут давать сбой, если они не загружены с диска (это можно решить, записав их на диск непосредственно перед загрузкой).