Esta es una solución de trabajo para su problema:
Añadir el 2 de DLL (x86 y x64) a la solución en una subcarpeta. Hacer que se "Copiar si es más nuevo"
Referencia de la DLL correcta se utiliza para el desarrollo para la depuración de la DLL de 2 ha agregado. Hacerlo Copiar local = falso.
Lo que esto hace es que cuando se inicia la aplicación de la DLL no se carga automáticamente. No se cargará hasta que use un Tipo de ese ensamblaje. Una vez que eso suceda, se desencadenará un evento en .Net que le preguntará dónde puede encontrar su ensamblaje.
Así que en algún momento antes del primer uso de ese montaje compruebe que esté instalado a sí mismo a ese evento.
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
En el contenido del controlador, asegúrese de cargar el archivo DLL (x86 o x64) cuando lo solicite.
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. Ahora puede ejecutar su aplicación como 32 bits y 64 bits.
Como alternativa a la adición de los archivos DLL en una subcarpeta, puede que sean lo más recursos incrustados, y luego cargarlos como esto:
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;
}
Esto no funciona para todos los conjuntos. Algunos ensambles "híbridos" tienden a fallar a menos que se carguen desde el disco (se pueden resolver escribiéndolos en el disco justo antes de cargarlos).
Si usted va a ser el desarrollo de una aplicación de 32/64-bit, que realmente debería estar en un sistema operativo de 64 bits. Al menos con Windows, un sistema operativo de 32 bits no puede ejecutar programas de 64 bits, pero un sistema operativo de 64 bits puede ejecutar programas de 32 bits. – rossipedia
Otra pregunta para reflexionar es "¿Mi aplicación * realmente * necesita ejecutarse en 64 bits?" WOW hace un trabajo maravilloso ejecutando una aplicación de 32 bits en x64. – vcsjones