2011-01-18 1 views
5

Il nostro prodotto è basato su una serie di progetti C++, ma ora stiamo utilizzando i progetti C# per il front-end. Ora stiamo anche facendo una versione a 64 bit.
Il nostro piano è quello di costruire tutte le DLL C# come AnyCPU. I progetti C# avranno riferimenti alle DLL C++ in una cartella bin comune. Quando si costruisce x64 la cartella bin conterrà le versioni x64 delle nostre DLL C++ e quando si costruisce Win32 la cartella bin conterrà le versioni a 32 bit delle nostre DLL C++. Quindi i progetti C# costruiranno AnyCPU ma includeranno una dll x64 o Win32 C++.
La mia domanda è, funzionerà? In fase di esecuzione tutto dovrebbe essere o tutto 32 o tutto 64 a seconda di quale exe stiamo correndo, ma è possibile compilare il tempo gestendo un progetto che mira a AnyCPU che include una dll specifica per piattaforma? O dovremo fare versioni specifiche per piattaforma di tutte le nostre DLL C#? GrazieUn progetto C# AnyCPU include una dll specifica per la piattaforma

risposta

3

Per quanto mi ricordo, funziona.

Ho avuto solo DLL a 32 bit, C# compilato e si è arrestato in modo anomalo all'avvio. Quindi se metti lì DLL a 64 bit, penso che non sia necessario ricompilare C#.

2

L'ho fatto. Sebbene fornisca avvertimenti di compilazione.

2

Dovrebbe funzionare, ho usato tale approccio in passato e funziona bene. che tipo di avvisi di compilazione ottieni?

8

Si tratta principalmente di un problema di distribuzione, ottenendo le DLL corrette selezionate per il sistema operativo corretto. Piuttosto semplice se si creano due progetti di installazione, uno per x86 e un altro per x64.

È possibile farlo funzionare in modo trasparente. Dovresti creare, ad esempio, una sottodirectory x86 e una x64 nella directory che contiene il tuo EXE e inserire rispettivamente le build a 32 bit e 64 bit delle DLL in quelle sottodirectory. All'avvio, controlla IntPtr.Size per conoscere la bit-ness del tuo processo. Quindi aggiungere di conseguenza SetDllDirectory in modo che Windows trovi la DLL corretta. In questo modo:

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); 

Utilizzare un evento post build per copiare le DLL. L'utilizzo di Environment.SetEnvironmentVariable() per aggiungere la directory alla variabile d'ambiente PATH rappresenta un altro approccio.