2016-01-15 18 views
6

installieren Ich habe eine Anwendung in VS 2015 kompiliert und erfordert die VC++ Redistributable Paket, um richtig zu laufen. Vor diesem letzten Build verwendeten wir eine ältere Version von VS und verwendeten einfach ein Mergemodul, um die Installation der entsprechenden Redist-Dateien zu übernehmen. Allerdings habe ich festgestellt, dass, wenn die neueste Version der Mergemodule für das Jahr 2015 (Microsoft_VC140_CRT_x64.msm) mit, dass meine Anwendung immer noch nicht aus dem Kasten heraus arbeiten. I did some digging und es scheint, dass einige Dinge mit der neuesten Version der Merge-Module geändert haben. Es scheint, dass Microsoft jetzt empfiehlt, das Paket vcredist_x64.exe direkt zu installieren, anstatt Mergemodule zu verwenden.WIX laufen vcredist_x64.exe auf

Also, ich bin versucht, eine benutzerdefinierte Aktion zu erstellen, dies zu tun. Ich bin nach einem similar tutorial here, obwohl es für die VC Neuverteilung ausführbaren anzupassen. Das erste, was ich tun muß, ist Setup, wo die EXE-Datei einmal platziert werden wird installiert:

<Directory Id='APPLICATIONROOTDIRECTORY' Name='MyApp'> 
    <Directory Id="VCREDISTDIR" Name="VCRedist"> 
    </Directory> 
</Directory> 

Dann brauche ich meine Dateien in eine Komponentengruppe hinzufügen, die als Teil eines versteckten installiert werden Feature (wie ich möchte, dass dies automatisch installiert wird).

<ComponentGroup Id="VCRedist" Directory="VCREDISTDIR"> 
    <Component Id="vcredist_x64.exe" Guid="-INSERT-GUID-HERE-" Win64="yes"> 
    <File Id="VCREDISEXE" Name="vcredist_x64.exe" KeyPath="yes" Source="$(var.VCRedistSourceDir)" Checksum="yes"></File> 
    </Component> 
</ComponentGroup> 

Und ...

<Feature Id="VCRedistributable" Title="Visual C++ Runtime" AllowAdvertise="no" Display="hidden" Level="1"> 
    <ComponentGroupRef Id="VCRedist" /> 
</Feature> 

An diesem Punkt sollte die vcredist_x64.exe auf die Maschine des Endbenutzers kopiert werden. Jetzt muss ich eine benutzerdefinierte Aktion erstellen, um die ausführbare Datei nach der Installation zu starten.

<CustomAction Id="InstallVCRedistributable" 
      FileKey="VCREDISEXE" 
      Execute="deferred" 
      ExeCommand="/silent" 
      Impersonate="no" 
      Return="check"/> 

<InstallExecuteSequence> 
    <Custom Action="InstallVCRedistributable" Before="InstallFinalize"> 
    <![CDATA[NOT REMOVE]]> 
    </Custom> 
</InstallExecuteSequence> 

ich auch eine Statusmeldung an meine UI, damit ich sehen kann, wenn die ausführbare Datei ausgeführt wird. Jetzt

<UI> 
    <ProgressText Action="InstallVCRedistributable">Installing Visual C++ Redistributable for Visual Studio 2015</ProgressText> 
</UI> 

, wenn ich mein Installationsprogramm soll es die vcredist_x64.exe starten ... und es tut ... aber dann während der Installation von ausführbaren dass es aufgehängt wird. Ich erhalte eine Popup-Nachricht, die besagt, dass ein Problem mit diesem Windows Installer-Paket vorliegt und ein Programm, das als Teil des Setups ausgeführt wurde, nicht abgeschlossen wurde. Es rollt dann meine Hauptanwendungsinstallation zurück und wird nie installiert. Kann jemand erklären, warum dies geschieht und wie man es beheben kann? Vielen Dank!

+0

FYI, das Hinzufügen von Microsoft_VC140_CRT_x64.msm in Ihrem Installer * funktioniert * solange das Zielsystem auch den Universal CRT installiert hat. Das Mergemodul selbst ist nicht mehr vollständig unabhängig. –

Antwort

3

Ich denke, der richtige Ansatz, wenn Voraussetzungen mit zu nehmen, die ihre eigenen Installateure haben, ist ein WiX Bootstrap Bündel zu schaffen, die durch jeden Installateur wiederum läuft. Dies behandelt Dinge wie Rollbacks bei Installationsfehlern usw., die beim Ausführen von benutzerdefinierten Aktionen innerhalb eines Installationsprogramms nicht möglich sind.

A Barebone Probe kann here, fügen Sie <MsiPackage> und <ExePackage> in der in der Reihenfolge Chain Element gesehen werden Sie sie zu installieren.

+0

Ich hatte gehofft, ich könnte ohne einen Bootstrapper davonkommen. Aber es ist vielleicht nicht möglich. Der Hauptgrund ist, dass ich bereits eine benutzerdefinierte .msi-Datei habe, die automatisch meine EULA in verschiedenen Kulturen anzeigt. Ich bin nicht sicher, ob es möglich ist, die Lizenzdatei mit der Bootstrap-Anwendung wegzulassen und einfach zu verwenden, um die .msi und dann die vcredist_x64.exe auf einmal zu installieren. Aber ich denke, ich muss noch mehr graben. Wenn Sie andere, möglicherweise mehr "elegante" oder "msi-freundliche" Möglichkeiten haben, dies zu tun, lassen Sie es mich bitte wissen. – andyopayne

+0

Weiß jemand auch, warum meine aktuelle Implementierung, die eine benutzerdefinierte Aktion zum Starten der EXE-Datei verwendet, fehlschlägt? Es scheint, als ob es funktionieren sollte. Liegt es daran, dass vcredist_x64.exe ein Kontrollkästchen zur Installation enthält, in dem Sie aufgefordert werden, den Nutzungsbedingungen zuzustimmen? Könnte dies dazu führen, dass mein Installer fehlschlägt? – andyopayne

+0

Sie können den Bootstrapper Ihre MSI-Installer-Schnittstelle anzeigen lassen, wenn Sie ihn ausführen, und ich denke, Sie können auch festlegen, dass der Bootstrapper kein UI hat. –

5

fand ich diese Frage und versuchte es selbst, in der gleichen Situation sein. Ich habe festgestellt, dass der Installer-Fehler bei Ihnen aufgetreten ist/ist Fehler 1618: "Eine andere Installation wird bereits ausgeführt." Es scheint, dass das Ausführen des vc_redist-Installers in Ihrem eigenen Installer einfach nicht funktioniert.

Ihre anderen Optionen scheinen einen Bootstrapper zu erstellen, wie Patrick Allwood oben vorgeschlagen hat, oder einfach die Benutzer zu bitten, das vc_redist-Paket selbst zu installieren, bevor Sie Ihr eigenes Installationsprogramm ausführen.Sie können erkennen, ob der Universal-C Runtime bereits vorhanden ist für ucrtbase.dll in C:\Windows\System32 durch Überprüfung:

<Property Id="UCRTINSTALLED"> 
    <DirectorySearch Id="UCRTSystemSearch" Path="[WindowsFolder]System32" Depth="0"> 
    <FileSearch Id="UCRTFileSearch" Name="ucrtbase.dll" MinVersion="10.0.10240.16389" /> 
    </DirectorySearch> 
</Property> 

Wenn Sie nur ein 32-Bit-Installationsprogramm haben, können Sie auch direkt die [SystemFolder] Eigenschaft verwenden.

EDIT: Wie Kevin Smyth erwähnt, gibt die Version ucrtbase.dll seltsame Probleme - Reporting Version 2.X zu einigen Tools und Version 10.Y zu anderen Tools. Sie können die Eigenschaft MinVersion entfernen, wenn Sie nur nach der Existenz von ucrtbase.dll suchen möchten.

+0

Ich kann es nicht mit MinVersion arbeiten ?! (Ich habe "10.0.10586.0" auf meiner ucrtbase.dll) Irgendwelche Ideen? – Macke

+1

Diese MinVersion-Prüfung schlägt fehl! 'win32api.GetFileVersionInfo ('ucrtbase.dll', '\\')' gibt '2.6.10586.0' für die Dateiversion auf meinem Windows 10 Rechner zurück. 'sigcheck.exe' gibt' 10.0.10586.0' zurück. Sehr komisch. Schlimmer noch, 'msiexec/i/log * xv' protokolliert nichts Nützliches. Ich habe 'MinVersion' entfernt und es funktioniert. –

+0

FYI: finding ucrtbase.dll wird bestätigen, dass die "Universal CRT" installiert ist. UCRT ist eine * Anforderung * für die MSVC 2015-Redistributables, und vc_redist.exe bewirkt, dass sie installiert werden, wenn sie verpasst werden. Da UCRT jedoch über Windows Update bereitgestellt wird, ist es durchaus möglich, dass ucrtbase.dll installiert wird, ohne dass die MSVC 2015-Redistributables installiert werden. tl; dr: Verwenden Sie nicht das Vorhandensein von ucrtbase.dll, um zu entscheiden, ob vc_redist.exe gestartet werden soll oder nicht. –

Verwandte Themen