Dies ist eine funktionierende Lösung für Ihr Problem:
Fügen Sie die 2 DLL (x86 und x64), um Ihre Lösung in einem Unterordner. Machen Sie sie "Copy if neuher"
Referenzieren Sie die richtige DLL, die Sie für die Fehlersuche aus den 2 DLLs verwenden, die Sie hinzugefügt haben. Machen Sie es Kopie lokal = falsch.
Dies bedeutet, dass beim Start der Anwendung die DLL nicht automatisch geladen wird. Es wird erst geladen, wenn Sie einen Type von dieser Assembly verwenden. Sobald dies passiert, wird in .Net ein Ereignis ausgelöst, das fragt, wo es Ihre Assembly finden kann.
Also irgendwann vor der ersten Verwendung dieser Baugruppe sicherstellen, dass Sie sich an dieses Ereignis anschließen.
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
Im Inhalt des Handlers sicherstellen, dass Sie die DLL (x86 oder x64) laden, wenn sie danach fragt.
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. Sie können Ihre App jetzt sowohl als 32-Bit- als auch als 64-Bit-Version ausführen.
Alternativ können die DLLs in einem Unterordner hinzufügen, können Sie sie als eingebettete Ressourcen machen und sie dann wie folgt laden:
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;
}
Dies funktioniert nicht für alle Baugruppen. Einige "hybride" Assemblies neigen dazu, zu versagen, wenn sie nicht von der Festplatte geladen werden (können gelöst werden, indem sie kurz vor dem Laden auf die Festplatte geschrieben werden).
Wenn Sie eine 32/64bit-App entwickeln, sollten Sie wirklich auf einem 64-Bit-Betriebssystem arbeiten. Zumindest unter Windows kann ein 32-Bit-Betriebssystem keine 64-Bit-Programme ausführen, aber ein 64-Bit-OS _kann_ 32-Bit-Programme ausführen. – rossipedia
Eine andere Frage, über die Sie nachdenken sollten, ist: "Muss meine App wirklich in 64-Bit laufen?" WOW macht einen wunderbaren Job mit einer 32-Bit-App auf x64. – vcsjones