2016-04-07 2 views
0

Ich versuche MSI durch Code zu installieren, und ich kam in dieser Lösung Programatically installing MSI packagesInstaller.InstallProduct wirft Ausnahme

Code:

public static void Install() 
{ 
    try 
    { 
     Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer"); 
     Installer installer = (Installer)Activator.CreateInstance(type); 
     installer.InstallProduct("D:\\Applications\\TortoiseSVN-1.9.3.27038-x64-svn-1.9.3", "ACTION=INSTALL"); 
    } 
    catch(Exception e) 
    { 
     Utilities.showErrorMessageBox(e.Message); 
    } 
} 

Die Ausnahme, die ich bekommen hat diese nicht beschreibende Nachricht: {“ InstallProduct, PackagePath, PropertyValues ​​"}

Ich weiß nicht, welchen Sinn es zu machen. Ich habe auch verschiedene Kombinationen von PropertyValues ​​ausprobiert, aber ohne Erfolg.

Kann jemand den Grund für diesen Fehler erklären?

EDIT

mit dem folgenden Werke:

System.Diagnostics.Process.Start("D:\\Applications\\TortoiseSVN-1.9.3.27038-x64-svn-1.9.3.msi"); 

So ist dieses Verfahren so fein wie der Installer?

+0

Ich bemerke nur den ersten Code nicht die ". MSI" im Dateipfad? –

+0

Ja, das habe ich verpasst, aber immer noch die gleiche Ausnahme, auch nachdem ich .msi im Pfad hinzugefügt habe –

+1

Ich habe nie die Installer-API benutzt, um Installationen zu starten, habe nie den Vorteil darin gesehen. Ich benutze nur die MSI mit Process.Start wie Sie, aber ich empfehle mit: msiexec.exe/i yossiz74

Antwort

0

IMO der einfachste Weg ist, rufen Sie die direkte API MsiInstallProduct und überprüfen Sie das Ergebnis, um zu sehen, was passiert ist. Die P/Invoke-Signatur ist einfach und das Ende des von Ihnen erwähnten Posts.

Programatically installing MSI packages

Das Problem mit vielen anderen Versuchen, die ich sehe, ist die Einführung einer unnötigen COM-Schicht. So können Sie in dieser COM-Schicht fehlschlagen, wenn die Umgebung nicht korrekt ist (Threads, Wohnungen und was sonst noch benötigt wird), und ein Fehler verschleiert den einfachen Fehler, den MsiInstallProduct zurückgibt (wie in Ihrem Fall).

Sorgfältige Kontrolle der Ausnahme (vielleicht eine innere Ausnahme) könnte einen HRESULT oder Integer-Ergebnis von MsiInstallProduct, vielleicht 4 Ziffern aus dieser Liste zeigen:

https://msdn.microsoft.com/en-us/library/aa368542(v=vs.85).aspx

Andernfalls setzen Sie die Windows Installer-Protokollierung Politik erstellen ein ausführliches Protokoll:

https://support.microsoft.com/en-us/kb/223300

mit voicewarmupx im String-Protokollierung und sucht dann in% TEMP% für die MSIxx.log Datei. Dies setzt voraus, dass Ihre Umgebung das Problem nicht verursacht. Wenn Sie den Code von einem lokalen Systemkonto ausführen, gibt es Möglichkeiten für einen Fehler, wenn das MSI versucht, auf Elemente wie den Desktop für das lokale Systemkonto zuzugreifen. Sie werden dieses Protokoll benötigen, um zu sehen, was vor sich geht. Wenn die MSI-Datei keine Benutzeroberfläche hat und eine Erhöhung erfordert, wird sie nicht nach einer Erhöhung gefragt und schlägt fehl. Wenn es eine externe CAB-Datei hat, kann sie es vielleicht nicht finden, dann scheitern. Wenn es von einem zugeordneten Laufwerksspeicherort ausgeführt wird, kann es auch fehlschlagen. Es geht also nicht nur um den Code, weil die Umgebung zählt. Es gibt viele Fehlerpunkte, die nichts mit der Codierung zu tun haben.