Jest to roztwór roboczy dla swojego problemu:
dodać 2 DLL (x86 i x64) do roztworu w podfolderze. Zrób je "Kopiuj jeśli jest nowsza"
Odsyłam do poprawnej biblioteki DLL, której używasz do programowania w celu debugowania z 2 dodanych bibliotek DLL. Make it Copy Local = false.
Co to jest, że po uruchomieniu aplikacji biblioteka DLL nie jest ładowana automatycznie. Nie zostanie załadowany, dopóki nie zostanie użyty typ z tego zespołu. Gdy to się stanie, zdarzenie zostanie wywołane w .Net, które zapyta, gdzie może znaleźć swój zespół.
Tak więc przed pierwszym użyciem tego zestawu upewnij się, że przyłączyłeś się do tego wydarzenia.
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
W treści przewodnika upewnij się załadować biblioteki DLL (x86 lub x64), gdy o to poprosi.
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;
}
Voila. Możesz teraz uruchomić aplikację zarówno w wersji 32-bitowej, jak i 64-bitowej.
Alternatywnie do dodawania DLL w podkatalogu, można dokonać ich jako zasobów wbudowanych, a następnie załadować je tak:
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;
}
ta nie działa dla wszystkich zespołów. Niektóre zespoły "hybrydowe" zwykle ulegają awarii, chyba że są ładowane z dysku (można je rozwiązać, zapisując je na dysku tuż przed załadowaniem).
Jeśli masz zamiar rozwijać aplikację 32/64-bitową, powinieneś być na 64-bitowym systemie operacyjnym. Przynajmniej w systemie Windows 32-bitowy system operacyjny nie może uruchamiać programów 64-bitowych, ale 64-bitowy system operacyjny może uruchamiać programy 32-bitowe. – rossipedia
Kolejne pytanie do rozważenia to: "Czy moja aplikacja * naprawdę * musi działać w wersji 64-bitowej?" WOW wykonuje cudowną pracę, uruchamiając 32-bitową aplikację na x64. – vcsjones