Frage

Seit VS 2005, ich sehe, dass es nicht möglich ist, eine dll gegen MS Runtime einfach zu erstellen und bereitstellen sie zusammen ( http://www.ddj.com/windows/184406482 ). Ich bin zutiefst verwirrt durch manifest, SxS und co: MSDN-Dokumentation ist wirklich schlecht, mit zirkulären Referenzen; besonders da ich mehr ein Unix-Kerl bin, finde ich alle uninformativ. Mein Kernproblem eine dll gegen msvc9 oder msvc8 ist die Verknüpfung: da diese Laufzeit sind nicht verteilbar, was sind die Schritte, wie eine DLL zu verknüpfen und bereitstellen? Insbesondere, wie erzeugt das Manifest (ich will nicht mt.exe, möchte ich etwas, das portable über Compiler ist), wie werden sie eingebettet sind, verwendet? Was ist Seite an Seite Montage bedeuten?

Im Grunde genommen, wo kann ich jede Art von Spezifikation finden statt MS-Jargon?

Danke an alle, die beantwortet, das war wirklich hilfreich,

War es hilfreich?

Lösung

Wir verwenden eine einfache Include-Datei in allen unseren Anwendungen und DLL, vcmanifest.h, dann alle Projekte auf der Manifest-Datei eingebettet.

vcmanifest.h

/*----------------------------------------------------------------------------*/

#if _MSC_VER >= 1400

/*----------------------------------------------------------------------------*/

#pragma message ( "Setting up manifest..." )

/*----------------------------------------------------------------------------*/

#ifndef _CRT_ASSEMBLY_VERSION
#include <crtassem.h>
#endif 

/*----------------------------------------------------------------------------*/

#ifdef WIN64
    #pragma message ( "processorArchitecture=amd64" )
    #define MF_PROCESSORARCHITECTURE "amd64"
#else
    #pragma message ( "processorArchitecture=x86" )
    #define MF_PROCESSORARCHITECTURE "x86"
#endif 

/*----------------------------------------------------------------------------*/

#pragma message ( "Microsoft.Windows.Common-Controls=6.0.0.0") 
#pragma comment ( linker,"/manifestdependency:\"type='win32' " \
                  "name='Microsoft.Windows.Common-Controls' " \
                  "version='6.0.0.0' " \
                  "processorArchitecture='" MF_PROCESSORARCHITECTURE "' " \
                  "publicKeyToken='6595b64144ccf1df'\"" )

/*----------------------------------------------------------------------------*/

#ifdef _DEBUG
    #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".DebugCRT=" _CRT_ASSEMBLY_VERSION ) 
    #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
            "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".DebugCRT' "         \
            "version='" _CRT_ASSEMBLY_VERSION "' "                          \
            "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
            "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
#else
    #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT=" _CRT_ASSEMBLY_VERSION ) 
    #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
            "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT' "              \
            "version='" _CRT_ASSEMBLY_VERSION "' "                          \
            "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
            "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
#endif

/*----------------------------------------------------------------------------*/

#ifdef _MFC_ASSEMBLY_VERSION
    #ifdef _DEBUG
        #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC=" _CRT_ASSEMBLY_VERSION ) 
        #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
                "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC' "              \
                "version='" _MFC_ASSEMBLY_VERSION "' "                          \
                "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
                "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
    #else
        #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC=" _CRT_ASSEMBLY_VERSION ) 
        #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
                "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC' "              \
                "version='" _MFC_ASSEMBLY_VERSION "' "                          \
                "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
                "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
    #endif
#endif /* _MFC_ASSEMBLY_VERSION */

/*----------------------------------------------------------------------------*/

#endif /* _MSC_VER */

/*----------------------------------------------------------------------------*/

Andere Tipps

Die einfachste Sache zu tun: Unter der Annahme einer Standard von VS2005 installieren, werden Sie einen Weg haben, wie:

C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT

Gehen Sie, die Dateien in diesem Ordner Redist greifen, und legen Sie das manifest und die msvcr80.dll (mindestens) in Ihren Anwendungen Exe-Ordner. Diese Dateien, die in der Wurzel Ihrer Installation sollten Sie Ihre exe und alle DLLs ermöglichen gegen sie verbunden sind, einwandfrei zu arbeiten, ohne Rückgriff Module zu verschmelzen, MSIs oder in der Tat jede Art von Just-in-Time-Erkennung, dass die Laufzeit nicht installiert ist.

Hier ist der Blog-Eintrag Erläuterung des rationalen hinter dem SxS crt Entscheidung für VC ++ . Es enthält die erklärt, wie schlimm es ist statisch die crt zu verknüpfen, und warum Sie sollten das nicht tun.

Hier ist die Dokumentation, wie eine Verknüpfung zu statisch die crt .

Nun, ich habe einige diese Probleme auftreten, so vielleicht einige meine Kommentare hilfreich sein werden.

  1. Das Manifest ist eine XML-Datei. Während VS können und für Sie machen, wenn Sie kompilieren, ist die andere Lösung eine Ressourcendatei (.rc) und kompilieren sie in eine kompilierte Ressourcendatei (.res) unter Verwendung der Ressourcen-Compiler (rc.exe) mit VS enthalten produzieren . Sie wollen die VS Kommandozeile aus dem Tools-Menü laufen, die rc im Weg sein, bewirkt, sowie verschiedene Umgebungsvariablen richtig einstellen. Dann ist Ihre Ressource kompilieren. Die resultierende Re-Datei kann von anderen Compilern verwendet werden.
  2. Stellen Sie sicher, dass Ihr Manifest XML-Datei der Größe von 4 teilbar ist hinzufügen Leerzeichen in der Mitte davon, dies zu erreichen, wenn nötig. Versuchen Sie zu vermeiden alle Zeichen, die vor dem openning xml-Tag oder nach dem Schließen xml-Tag. Ich habe manchmal Probleme mit diesem. Wenn Sie 2 falsch tun Schritt, erwarten nebeneinander Konfigurationsfehler zu erhalten. Sie können überprüfen, ob das Ihr Fehler ist die exe in einem Ressourcen-Editor von openning (z devenv.exe) und die Manifest-Ressource zu untersuchen. Sie können auch ein Beispiel für ein korrektes manifest sehen nur durch eine integrierte Datei zu öffnen, obwohl beachten Sie, dass DLLs und EXE-Dateien haben winzige Unterschiede in welcher ID die Ressource gegeben werden soll.

Sie werden wahrscheinlich auf Vista zu testen, um sicherzustellen, dies richtig funktioniert.

Sie sind verteilbar und Sie in MSVS Verzeichnis verteilbare Pakete.

Build mit Laufzeit Ihrer Wahl, fügen Sie entsprechendes Paket zu Ihrem Installateur und nicht die Mühe - es wird funktionieren. Der Unterschied ist, -. Sie sind installiert in einem anderen Ort jetzt (aber das ist auch, wo Sie Ihre App für Bibliotheken aussehen wird)

Ansonsten MSDN oder im Grunde jedes nicht allzu altes Buch auf Windows c ++ Programmierung.

Danke für die Antwort. Für den Einsatz per se, kann ich drei Optionen sehen, dann:

  • Verwenden von .msi-Richtlinie zusammenführen.
  • Verwenden der verteilbare VS-Paket und führen Sie es vor meinem eigenen Installer
  • Kopieren der verteilbare Dateien entlang meiner eigenen Anwendung. Aber in diesem Fall, wie bezeichne ich es in einer Dateisystem-Hierarchie (zB Bar / foo1 / foo1.dll und Bar / foo2 / foo2.dll verweisen in bar msvcr90.dll /)? Ich meine, neben den offensichtlichen und hässlich „kopieren Sie die DLL in jedem Verzeichnis, in dem Sie schon haben, die davon abhängt).

Sie können nicht den VC ++ 8 SP1 / 9 CRT als Mergemoduls auf Vista und Windows Server 2008 verwenden, wenn Sie Dienste haben Sie starten oder Programme mögen, die Sie vor dem „InstallFinalize“ -Aktion in der ausgeführt werden sollen MSI.

Das ist, weil der DLLs in WinSxS in der "InstallFinalize" Aktion installiert ist.

Aber das MSI "ServiceStart" Aktion kommt vor diesem.

So verwenden entweder ein Bootstrap-Programm „ http://www.davidguyer.us/bmg/publish HTM "

Oder schauen Sie in das Installationsprogramm mit im Installer 4.5 variert werden kann. Aber das bedeutet, dass Sie ein Bootstrap-Programm benötigen 4.5 zu installieren, so scheint es ein wenig sinnlos ..

Wenn Sie die Microsoft-DLLs / Manifest-Dateien bereitstellen mögen und verwenden Java JNI dann müssen Sie sie in dem Verzeichnis ist Ihre JDK / JRE setzen.

Wenn Sie die App in JBoss ausgeführt wird, dann müssen Sie sie in der JBoss / bin setzen.

Sie können Ihre JNI DLL gegebenenfalls für Ihre Anwendung setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top