2009-07-14 2 views
6

Ich schreibe einen Windows-Dienst in C#, der mehrere Instanzen einer anderen Anwendung hervorbringt, die ich schreibe. Es besteht die Möglichkeit, dass die Anwendung überall auf einem Computer installiert werden kann. Was ist der beste Weg, um den Service wissen zu lassen, wo sich die Anwendung befindet?Wie kann der Speicherort einer Anwendung bestimmt werden?

Antwort

6

Wenn Sie meinen, dass der Dienst startet eine verschiedene App, dann; Optionen:

  • Konfigurieren Sie den Dienst mit einer Konfigurationsdatei; legte den Weg in dort
  • etwas in der Registrierung während der Installation
  • Verwendung so etwas wie COM/COM + Registrierungen
  • betrachten das GAC, wenn die andere App ist .NET (obwohl ich kein Fan bin. ..)
  • Umgebungsvariable?

Persönlich mag ich die Konfigurationsdatei Option; es ist einfach und leicht zu pflegen, ermöglicht und mehr separate (Side-by-Side) Service und App-Installationen

+0

Ich würde gerne mehr über die Verwendung des gac in diesem Szenario wissen, obwohl ich mir der Gefahren bewusst bin, wie würde das funktionieren? Was ist mit der Konfigurationsdatei, wäre sie eingebettet? Wenn es nicht eingebettet ist, wo sollte eine Konfiguration für einen Service existieren? – Firoso

+0

Ich werde wahrscheinlich mit der Config-Datei-Methode gehen, aber ich möchte auch mehr über die Verwendung der GAC auf diese Weise wissen. – MGSoto

1
using System.IO; 
using System.Windows.Forms; 

string appPath = Path.GetDirectoryName(Application.ExecutablePath) 

Das ist für eine Anwendungen (oben).

für ein asp.net Projekt:

using System.Web; 

HttpContext.Current.Server.MapPath("place arguments here"); 
+0

Dies funktioniert nicht in einem Dienst, der keine Formulare hat – Treb

+0

Ein Dienst kann Windows-Formulare ohne Problem verweisen. Die obige Zeile verwendet keine Formulare und sollte in Ordnung sein. Aber es gibt einfachere Möglichkeiten, die Codebasis zu bekommen! –

+0

Entschuldigung, missverstanden die Frage - ich dachte, er wollte den Standort des Dienstes bekommen. – Treb

8

Wenn Sie den Ordner mit dem Service für Dich installiert ist, müssen lokalisieren können Sie den folgenden Code

this.GetType().Assembly.Location 
verwenden

Wenn Sie den Ordner, eine andere Anwendung lokalisieren, wird Ihnen installiert sollte eine Anfrage an Windows Installer machen

[DllImport("MSI.DLL", CharSet = CharSet.Auto)] 
private static extern UInt32 MsiGetComponentPath(
    string szProduct, 
    string szComponent, 
    StringBuilder lpPathBuf, 
    ref int pcchBuf); 

private static string GetComponentPath(string product, string component) 
{ 
    int pathLength = 1024; 
    StringBuilder path = new StringBuilder(pathLength); 
    MsiGetComponentPath(product, component, path, ref pathLength); 
    return path.ToString(); 
} 
1

System.Environment.CurrentDirectory

1

Schreiben Sie während der Installation eine Registrierungsvariable. Auf diese Weise können Sie bei der Bereitstellung eines Upgrades den zuvor geschriebenen Wert zurücklesen und standardmäßig den zuvor ausgewählten Benutzerordner verwenden.

Verwandte Themen