2011-09-24 14 views
6

Necesito hacer referencia a un archivo DLL que está disponible en 2 versiones (una para 32 bits y otra para 64 bits). Mi objetivo es crear una aplicación web que funcione en sistemas de 32 y 64 bits.Utilizando un dll específico de 32 bits o 64 bits, dependiendo del bitness del proceso

pensé en referencia a la asamblea de 32 bits por defecto y utilizar el evento AssemblyResolve para cargar la versión de 64 bits (si la carga de la versión de 32 bits con errores):

static void Main(string[] args) 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += _AssemblyResolve; 
    // Try LoadAssembly ... 
} 

static System.Reflection.Assembly _AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    var path = string.Format(@"...\lib_x64\{0}.dll", args.Name); 
    return Assembly.LoadFrom(path); 
} 

Pero incluso cuando se produce un BadImageFormatException, el manejador _AssemblyResolve se no ser llamado ¿Hay alguna otra manera de lograr el comportamiento propuesto?

Respuesta

0

Ver answers for dealing with this for System.Data.SQLite.

Creo que su método propuesto debería funcionar, pero necesita mover la versión de 32 bits para que no se pueda encontrar de forma predeterminada, por lo que siempre se llama a _AssemblyResolve para esa dll. Eso es solo una suposición.

+0

Parece que no hay mejor manera. Gracias de cualquier manera. – ollifant

1

forma más sencilla pero menos flexible desde mi punto de vista se especifique explícitamente plataforma referencias específicas en el archivo csproj utilizando Condition:

<ItemGroup Condition=" '$(Platform)' == 'x86' "> 
    <Reference Include="MyAssemblyx86"> 

También usted puede hacerlo de forma dinámica utilizando Assembly.Load(AssemblyName) sobrecarga del método. parámetro es de tipo AssemblyName que expone la propiedad AssemblyName.ProcessorArchitecture que podría ser definido como Ninguno, MSIL, X86, X64, IA64, AMD64

Una cosa que también podría estudiar es la Publisher Policy File función y el comando argumento de la línea /platform:processorArchitecture

+0

Usar una condición dentro del archivo de proyecto solo hace una distinción en tiempo de compilación. Por lo tanto, aún sería necesario redistribuir 2 versiones diferentes. – ollifant

+0

La solución Assembly.Load funcionaría, pero esto requeriría que use mucha reflexión. O quizás también sea dinámico. – ollifant

+0

@ollifant: .NET Framework admite dos formas de resolución de ensamblaje: mediante referencia estática o dinámica. Referencia dinámica: Assembly.Load()/etc, static: hace referencia al ensamblado a través del archivo de proyecto o como dependencia de otra referencia a través de metadatos. Una cosa que también podría consultar en la función 'Archivo de política de publicación' y argumento de línea de comando'/platform: processorArchitecture' – sll

Cuestiones relacionadas