2011-01-18 7 views
5

Nuestro producto se basa en un grupo de proyectos C++, pero ahora estamos utilizando proyectos C# para el front-end. Ahora también estamos haciendo una versión de 64 bits.
Nuestro plan es construir todos los dlls C# como AnyCPU. Los proyectos de C# tendrán referencias a los dlls de C++ en una carpeta bin común. Al compilar x64, la carpeta bin contendrá versiones x64 de nuestros dlls de C++ y al compilar Win32, la carpeta bin contendrá versiones de 32 bits de nuestros dlls de C++. Entonces, los proyectos de C# construirán AnyCPU pero incluirán x64 o Win32 C++ dll.
Mi pregunta es, ¿funcionará? En tiempo de ejecución, todo debe ser 32 o 64 según el ejecutable que se ejecute, pero ¿puede compilar el tiempo manejar un proyecto que apunta a AnyCPU que incluye un dll específico de la plataforma? ¿O tendremos que hacer versiones específicas de plataforma de todos nuestros dlls C#? Gracias¿Puede un proyecto C# AnyCPU incluir un dll específico de plataforma?

Respuesta

3

Por lo que recuerdo, esto funciona.

Tenía solo 32bit DLL, C# compiled y se bloqueó al iniciar. Entonces, si colocas allí 64bit DLL, creo que no necesitas recompilar C#.

2

Lo he hecho. Aunque da advertencias de compilación.

2

Debería funcionar, he utilizado este enfoque en el pasado y funciona bien. ¿Qué tipo de advertencias de compilación recibes?

8

Esto es principalmente un problema de implementación, obteniendo las DLL correctas seleccionadas para el sistema operativo correcto. Bastante sencillo si crea dos proyectos de configuración, uno para x86 y otro para x64.

También es posible hacerlo funcionar de forma transparente. Creará, digamos, un subdirectorio x86 y x64 en el directorio que contiene su EXE y colocará respectivamente las compilaciones de 32 bits y 64 bits de las DLL en esos subdirectorios. Al inicio, compruebe IntPtr.Size para conocer el bit-ness de su proceso. Luego pinvoke SetDllDirectory en consecuencia para que Windows encuentre la DLL correcta. De esta manera:

using System.Runtime.InteropServices; 
using System.Reflection; 
using System.IO; 
... 
     public static void SetupDllDirectory() { 
      string path = Assembly.GetEntryAssembly().Location; 
      path = Path.Combine(path, IntPtr.Size == 8 ? "x64" : "x86"); 
      bool ok = SetDllDirectory(path); 
      if (!ok) throw new System.ComponentModel.Win32Exception(); 
     } 

     [DllImport("kernel32.dll", SetLastError = true)] 
     private static extern bool SetDllDirectory(string path); 

Utilice un evento de compilación posterior para copiar los archivos DLL. El uso de Environment.SetEnvironmentVariable() para agregar el directorio a la variable de entorno PATH es otro enfoque.

Cuestiones relacionadas