2010-02-03 12 views
7

Ho un'applicazione MFC che sto cercando di impacchettare per la distribuzione. Sembra dipendere dai file "msvcr90.dll", "msvcp90.dll" e "mfc90.dll". Qual è il modo corretto per distribuire questi file?Modo corretto per distribuire i file di runtime VC++

Non riesco a utilizzare i moduli di unione poiché il mio programma di installazione non li supporta. So che posso eseguire VCRedist_x86.exe, ma non voglio farlo per vari motivi.

Per quanto posso vedere, l'unica alternativa è installare i file come assembly Side-by-Side privati. È corretto?

Secondo http://msdn.microsoft.com/en-us/library/ms235317(VS.80).aspx il modo corretto di installare un assembly privato è copiare le cartelle "Microsoft.VC90.CRT" e "Microsoft.VC90.MFC" nella stessa cartella dell'eseguibile. È questo il modo corretto per risolvere il problema? Funziona, ma sembra un po '1990 per copiare i file di sistema in questo modo. Qualcuno può mostrarmi un esempio di un'altra applicazione (o almeno un progetto demo) che fa questo?

Infine, quando devo preoccuparmi di distribuire un file .manifest per la mia applicazione? Dovrei installare esplicitamente il file XML o è incorporato nel mio eseguibile in qualche modo?

+0

FWIW Ho fatto una domanda simile sulla spedizione delle DLL CRT. http://stackoverflow.com/questions/2131093/distributing-the-visual-c-runtime-libraries-msvcrt – Rob

+0

Benvenuti in DLL Hell, capitolo 3. * (I primi due capitoli riguardano problemi relativi alla posizione dei file e alla versione.) –

risposta

1

In genere, direi che è necessario installare il ridistribuibile richiesto sul computer di destinazione poiché è il "modo pulito". Ma puoi anche farlo nello stile degli anni '90. Dipende fortemente dalla lib di CRT/MFC che stai usando per costruire l'applicazione. Questo può essere controllato all'interno del file manifest. È anche possibile forzare l'applicazione a collegarsi con una lib specificata. Senza alcuna definiscono VS2008 normalmente si lega il 9.0.21022.8, con

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1 

le librerie più recenti sono prese. È inoltre possibile associare con una versione specificata:

#define _CRT_ASSEMBLY_VERSION "9.0.30729.1" 

e/o

#define _MFC_ASSEMBLY_VERSION "9.0.30729.1" 

Quindi, se si vuole fare lo stile anni '90, copiare i file dal C:\Windows\Winsxs\ e prendere le DLL da quella cartella Legato con, ad es da amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_99b61f5e8371c1d4 se si utilizza CRT per un'applicazione x64 o l'equivalente x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_99b61f5e8371c1d per la versione x86 di CRT.

+1

uhm, #define non accetta un operatore di assegnazione ... – kusma

1

Si potrebbe anche considerare il collegamento statico sia con MFC che con il CRT, quindi è sufficiente spedire i file EXE. Ci sono pro e contro a questo però.

+0

È vero, ma [Microsoft sconsiglia il collegamento statico] (http://msdn.microsoft.com/en-us/library/ms235316.aspx). – skst

1

Direi che è sufficiente mettere queste DLL insieme al tuo exe, perché il percorso corrente è il luogo in cui sono ricercate.

Ovviamente, dovresti cercare di installare il ridistribuibile poiché è la soluzione più sicura.

+0

L'utilizzo dei ridistribuibili è [la raccomandazione corrente di Microsoft] (http://msdn.microsoft.com/en-us/library/ms235316.aspx). – skst

+0

Questa è la risposta corretta. [Microsoft consiglia] (https://msdn.microsoft.com/en-us/library/ms235299.aspx) installando il ridistribuibile o installando le DLL accanto all'eseguibile.Per citare: "Per distribuire i file ridistribuibili di Visual C++, è possibile utilizzare i pacchetti ridistribuibili di Visual C++ inclusi in Visual Studio o utilizzare moduli di unione ridistribuibili oppure è possibile installare direttamente DLL di Visual C++ ridistribuibili nella cartella locale dell'applicazione, che è la cartella che contiene il file dell'applicazione eseguibile. " – Marc

Problemi correlati