2010-02-03 15 views
7

Ich habe eine MFC-Anwendung, die ich für die Bereitstellung verpacken möchte. Es scheint von den Dateien 'msvcr90.dll', 'msvcp90.dll' und 'mfc90.dll' abhängig zu sein. Was ist der richtige Weg, um diese Dateien zu verteilen?Richtiger Weg, um VC++ - Laufzeitdateien zu verteilen

Ich kann keine Mergemodule verwenden, da mein Installer sie nicht unterstützt. Ich weiß, dass ich VCRedist_x86.exe ausführen kann, aber ich möchte dies aus verschiedenen Gründen nicht tun.

Soweit ich sehen kann, ist meine einzige Alternative, die Dateien als Private Side-by-Side-Baugruppen zu installieren. Ist das richtig?

Nach http://msdn.microsoft.com/en-us/library/ms235317(VS.80).aspx die richtige Methode zum Installieren einer privaten Assembly ist das Kopieren der Ordner "Microsoft.VC90.CRT" und "Microsoft.VC90.MFC" in den gleichen Ordner wie die ausführbare Datei. Ist das der richtige Weg, um das Problem zu lösen? Es funktioniert, aber es scheint ein bisschen 1990er zu sein, Systemdateien auf diese Weise zu kopieren. Kann mir jemand ein Beispiel für eine andere Anwendung (oder zumindest ein Demo-Projekt) zeigen, die dies tut?

Zum Schluss, wann muss ich mir Gedanken über die Verteilung einer. Manifest-Datei für meine Anwendung machen? Soll ich die XML-Datei explizit installieren oder ist sie irgendwie in meine ausführbare Datei eingebettet?

+0

FWIW Ich stellte eine ähnliche Frage zum Versand der CRT-DLLs. http://stackoverflow.com/questions/2131093/distributing-the-visual-c-runtime-libraries-msvcrt – Rob

+0

Willkommen bei DLL Hell, Kapitel 3. * (Die ersten beiden Kapitel behandeln Probleme mit der Dateiposition und Versionsprobleme.) –

Antwort

1

Normalerweise würde ich sagen, dass Sie die erforderliche Redistributable auf dem Zielcomputer installieren sollten, da es der "saubere Weg" ist. Aber Sie können es auch im Stil der 90er Jahre machen. Es hängt stark davon ab, welche CRT/MFC-Lib Sie zum Erstellen der Anwendung verwenden. Dies kann in der Manifestdatei überprüft werden. Sie können die Anwendung auch erzwingen, mit einer angegebenen Lib zu binden. Ohne Definition bindet VS2008 normalerweise die 9.0.21022.8 mit

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1 

die neuesten libs werden genommen. Sie können auch mit einer bestimmten Version binden:

#define _CRT_ASSEMBLY_VERSION "9.0.30729.1" 

und/oder

#define _MFC_ASSEMBLY_VERSION "9.0.30729.1" 

Also, wenn Sie es den 90ern Stil tun möchten, kopieren Sie die Dateien aus C:\Windows\Winsxs\ und nehmen Sie die DLLs aus diesem Ordner gebunden mit, z von amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_99b61f5e8371c1d4, wenn Sie CRT für eine x64-Anwendung oder das entsprechende x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_99b61f5e8371c1d für die x86-Version von CRT verwenden.

+1

uhm, #define nimmt keinen Zuweisungsoperator ... – kusma

1

Sie können auch statisch mit MFC und dem CRT verknüpfen, dann müssen Sie nur Ihre EXE-Dateien versenden. Dafür gibt es Vor- und Nachteile.

+0

Das stimmt, aber [Microsoft rät von statischen Links ab] (http://msdn.microsoft.com/en-us/library/ms235316.aspx). – skst

1

Ich würde sagen, das ist genug, um diese DLLs zusammen mit Ihrer exe zu setzen, weil der aktuelle Pfad ist, wo sie zuerst gesucht werden.

Natürlich sollten Sie sich bemühen, das Redistributable zu installieren, da dies der sicherere Weg ist.

+0

Verwenden der redistributables ist die [aktuelle Empfehlung von Microsoft] (http://msdn.microsoft.com/en-us/library/ms235316.aspx). – skst

+0

Dies ist die richtige Antwort. [Microsoft empfiehlt] (https://msdn.microsoft.com/en-us/library/ms235299.aspx), entweder das Redistributable zu installieren oder die DLLs neben der ausführbaren Datei zu installieren.Um Folgendes zu zitieren: "Um verteilbare Visual C++ - Dateien bereitzustellen, können Sie die in Visual Studio enthaltenen Visual C++ Redistributable Packages verwenden oder redistributable Mergemodule verwenden, oder Sie können direkt verteilbare Visual C++ - DLLs im lokalen Ordner der Anwendung, dem Ordner, installieren das enthält die ausführbare Anwendungsdatei. " – Marc

Verwandte Themen