2010-02-18 11 views
9

Ich habe bei Google geforscht, um den geeigneten Weg zu finden, den Installationspfad zu bestimmen, den ein Benutzer im Installationsassistenten auswählt.Visual Studio-Installationsprojekt: Zielverzeichnis abrufen

Im Grunde laufe ich auf ein Problem, bei dem mein Dienst keine Dateien in seinem eigenen Verzeichnis erstellen kann, weil ihm die entsprechenden Berechtigungen fehlen. Ich gehe davon aus, dass der richtige Weg, dies zu lösen, darin besteht, sicherzustellen, dass jedes Konto, das der Dienst verwendet, entsprechende Dateiberechtigungen für seinen Ordner erhält.

Aber bevor ich überhaupt angehen kann, wie Berechtigungen über .Net festgelegt werden, muss ich den Installationsordner kennen. Ich verwende ein Installationsprojekt, das eine Installer-Klasse enthält, die ebenfalls ein ServiceInstaller Steuerelement enthält. Beide haben die Context-Eigenschaft, also habe ich das für die Parameter überprüft, die verfügbar sind, wenn das AfterInstall-Ereignis für die jeweiligen Installer ausgelöst wird. Ich dachte zuerst, ich würde die TargetDir Eigenschaft Set sehen, aber das war nicht der Fall. Ich sehe aber AssemblyPath setzen und auf die ausführbare Datei des entsprechenden Ordners zeigen.

Wesentlichen sicher, ich möchte nur sicherstellen, dass dies die geeignete Methode ist, sollte ich verwenden:

private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e) 
{ 
    string InstallPath = System.IO.Path.GetDirectoryName(serviceInstaller1.Context.Parameters["AssemblyPath"]);; 
} 

Antwort

12

fand ich, dass die Lösung, den Berg arbeitet für mich gab diesen Wert für die Custom Eigenschaft außer der Verwendung von:

/TargetDir="[TARGETDIR]\" 

Hinweis des Hinzufügen des Backslashs. Siehe hierzu article on MSDN.

+1

Sie müssen auch ein zusätzliches Leerzeichen nach dem umgekehrten Schrägstrich "\" hinzufügen. Andernfalls können Sie beim Installieren oder Deinstallieren eine FileNotFoundException-Ausnahme erhalten. Siehe [hier] (http://stackoverflow.com/questions/4516256/how-doi-i-fix-setup-project-with-custom-action-file-not-found-exception/4522825#4522825) oder [hier ] (http://stackoverflow.com/questions/8491095/error-1001-using-custom-installer-with-visual-studio-2008). –

+0

Wo verwenden Sie diesen Text? Deine Erklärung ist mir nicht ganz klar, Entschuldigung. Als Befehlszeilenargument für das Projekt? Irgendwo im Code? Diese Verbindung zu MSDN ist jetzt auch unterbrochen. Danke Microsoft! :-) –

+0

Oh, ich sehe jetzt. Ich habe die Antwort in einem anderen Post gefunden: "Fügen Sie in Ihrem Bereitstellungsprojekt eine benutzerdefinierte Aktion für die Installation und das Commit hinzu. Geben Sie für die CustomActionData-Eigenschaft für die benutzerdefinierte Installation Aktion ein/Targetdir =" [TARGETDIR] \ "" –

3

Ihre benutzerdefinierte Aktion ist eine Nachträglichkeit individuelle und nur bestimmte Eigenschaften sind es, siehe folgende Seite: für weitere Details, http://msdn.microsoft.com/en-us/library/aa370543(VS.85).aspx. Sie können möglicherweise die TARGETDIR-Eigenschaft zu den CustomActionData in Visual Studio 2008 hinzufügen; Ich habe jedoch nicht mit Visual Studio 2008 als Authoring-Tool gearbeitet.

Das Ausführen komplizierter Installationen in Visual Studio 2008 ist sehr schwierig, da es eine Reihe wichtiger Funktionen von MSI abstrahiert. Ich würde dringend empfehlen, einen Blick auf WiX zu werfen.

Auch wenn Sie WiX nicht verwenden, sollten Sie Orca, http://msdn.microsoft.com/en-us/library/aa370557(VS.85).aspx, herunterladen und damit Ihre Installation überprüfen. Dies wird Ihnen unzählige Stunden später ersparen.

+0

Kann WiX Windows-Dienste installieren? –

+0

Ja WiX kann Dienste installieren. Sie müssen nur das ServiceInstall-Element http://wix.sourceforge.net/manual-wix2/wix_xsd_serviceinstall.htm erstellen. WiX- und Visual Studio 2008-Setup-Projekte sind nur Frontends für MSI. Wenn Sie sich entscheiden, mit WiX zu gehen, würde ich vorschlagen, http://msdn.microsoft.com/en-us/library/aa370566(VS.85).aspx und alle seine Untereinträge zu lesen. Es wird Ihnen helfen, Komponenten und Funktionen zu verstehen. Ich habe ursprünglich mit Visual Studio 2003 \ 2005 für unsere Installationen begonnen und stieß dabei auf zu viele Einschränkungen. – LanceSc

+0

Ich musste bei einem Visual Studio-Installationsprojekt für dieses Projekt bleiben, aber +1, um mir eine brauchbare Alternative zur zukünftigen Forschung zu geben. :) –

0

Als Alternative zu den Installationsprojekten können Sie einige Installationsdienste für den Installateur verwenden. Ich denke, mit http://installer.codeeffects.com können Sie beliebige Dateien von Ihrer Website laden und sie in das Installationsverzeichnis stellen, wenn der Benutzer Ihren Dienst installiert. Hoffe das hilft.

-1

Soweit ich feststellen kann, ist dies die einzige Möglichkeit, das Installationsverzeichnis zu bestimmen. Natürlich werde ich zur Kenntnis nehmen, wenn jemand mit einer anderen Antwort kommt, aber bis dahin ist das meine Vorgehensweise.

+1

Dies ist keine Antwort. Welche Lösung Sie auch immer verwenden, ist die Antwort. –

0

Um das Zielverzeichnis Eigenschaftswert in der benutzerdefinierten Aktion erhalten Sie es manuell, indem Sie benutzerdefinierte Aktion Ausgabe in der benutzerdefinierten Aktion Ansicht und setzen so etwas wie weiterleiten können:

/TargetDir="[TARGETDIR]" 

als Wert für die Eigenschaft Custom .

Sie sollten dann in der Lage sein, es zugreifen:

string targetDir = Context.Parameters[ "TargetDir" ]; 
+0

Wie ich in meiner Frage gesagt habe, habe ich diesen Wert überprüft, aber leider nicht zum Zeitpunkt des Ereignisses gesetzt. –

1

Für diejenigen, die mehrere haben wie dieses Ich habe

/AppID="[APPID]" /Path="[TARGETDIR]\" 
2

Während der Installation von Ereignis zu tun haben dies:

// locate the installation directory and store it where we can find it during Commit 
stateSaver.Add("TargetDir", Context.Parameters["DP_TargetDir"]); 

dann konnte ich später für den Zugriff auf TargetDir während OnCommitted:

string path = (string)savedState["TargetDir"]; 

Nicht sicher, ob das hilft oder nicht! Ich versuche herauszufinden, wie das Installationsverzeichnis zuverlässig ermittelt werden kann, damit mein Dienst eine Protokollierung durchführen kann.

Verwandte Themen