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
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#.
L'ho fatto. Sebbene fornisca avvertimenti di compilazione.
Dovrebbe funzionare, ho usato tale approccio in passato e funziona bene. che tipo di avvisi di compilazione ottieni?
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.