2012-07-24 16 views
5

Duplicar posible:
Loading x86 or x64 assembly.NET links, biblioteca específica de la plataforma

Estoy intentando compilar Cualquier proyecto CPU .NET, pero tengo que enlazar librería SQLite que tiene diferentes versiones para plataformas x86 y x64. Cambiar solo las versiones de DLL a x64 no ayuda, la aplicación no se inicia, necesito volver a compilar el código usando la referencia x64. Cuando agrego referencias x86 y x64, no se compila debido a conflictos. No puedo compilar aplicaciones utilizando x86, porque una de las bibliotecas COM del sistema que estoy utilizando no funciona en WOW64.

All 32-bit VSS applications (requesters, providers, and writers) must run as native 32-bit or 64-bit applications. Running them under WOW64 is not supported

http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/eadf5dcd-fbd1-4224-9a56-b5843efebb15/

por lo que necesitan para construir cualquier proyecto de la CPU, pero la única solución a este problema que veo en este momento es tener proyectos duplicados para x86 y x64. ¿Hay algo mejor?

ACTUALIZACIÓN

Cuando me refiero a las bibliotecas de 64 bits en proyecto, pero intento cargar bibliotecas x 86 Me da la siguiente excepción.

The located assembly's manifest definition does not match the assembly reference.

+0

Gracias. He visto publicaciones como esa, pero el problema es que cambiar DLL no ayuda mucho. Todavía no funciona cuando copio archivos DLL de 64 bits en mi carpeta, aún necesito recompilar la aplicación que hace referencia a esas bibliotecas de 64 bits. ¿Estoy haciendo algo mal? ¿Y tampoco entiendo a qué versión debo hacer referencia? – axe

+1

Sí. Las bibliotecas nativas deben tener nombres idénticos, pero deben estar ubicadas en diferentes carpetas (como las subcarpetas de su aplicación). En tiempo de ejecución, usted llama a 'SetDllDirectory' para hacer que el sistema operativo busque en la carpeta correcta, dependiendo de la bitness. O use el evento 'AppDomain.CurrentDomain.AssemblyResolve' como [sugerido por Rover] (http://stackoverflow.com/questions/3787428/loading-x86-or-x64-assembly#comment7029800_6060754). No hace referencia directamente a esas bibliotecas, el contenedor administrado SQLite sí lo hace. Su código hará que el contenedor cargue la versión correcta de la biblioteca nativa subyacente. – GSerg

+0

Lo intenté una vez más, no funciona para mí. La aplicación se bloquea al inicio. El problema es que estoy haciendo referencia a bibliotecas x64 en el proyecto, pero selecciono bibliotecas x86 en tiempo de ejecución. Si construyo mi aplicación utilizando bibliotecas x86, funciona perfectamente en ventanas x86, de lo contrario no funciona. – axe

Respuesta

6

el problema principal era el hecho de que era el uso de diferentes versiones de SQLite para x86 y x64. añadí método

static private Assembly SQLitePlatformSpecificResolve(object sender, ResolveEventArgs args) 
{ 
    string platform = Environment.Is64BitProcess ? "x64" : "x86"; 
    string assemblyName = new AssemblyName(args.Name).Name; 
    string assemblyPath = Path.Combine(
     Environment.CurrentDirectory, "SQLite", platform, assemblyName + ".dll"); 

    return !File.Exists(assemblyPath) ? null : Assembly.LoadFrom(assemblyPath); 
} 

Y establecer controlador de eventos

AppDomain.CurrentDomain.AssemblyResolve += SQLitePlatformSpecificResolve; 

en el principal punto de entrada de la aplicación. Ahora carga el ensamblaje x86 para plataformas x86 y x64 en plataformas de 64 bits correspondientemente.

Gracias.

Cuestiones relacionadas