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
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
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");
Dies funktioniert nicht in einem Dienst, der keine Formulare hat – Treb
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! –
Entschuldigung, missverstanden die Frage - ich dachte, er wollte den Standort des Dienstes bekommen. – Treb
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();
}
System.Environment.CurrentDirectory
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.
- 1. Wie kann der Datentyp einer JSON-Eigenschaft bestimmt werden?
- 2. Die Popover-Pfeilrichtung kann nicht bestimmt werden
- 3. Wie bestimmt MSTest die Reihenfolge, in der Testmethoden ausgeführt werden?
- 4. Kann die Größe der herunterzuladenden Datei bestimmt werden?
- 5. Wie IE7 die Sicherheitszone einer Site bestimmt
- 6. T-SQL-Abfrage, um den Speicherort einer Anwendung zurückzugeben. EXE
- 7. Kann der Speicherort des NuGet 3.2-Paketcaches geändert werden
- 8. Kann die Anzahl der bitweisen Übergänge in einer 8-Bit-Ganzzahl bestimmt werden?
- 9. Wie wird der Speicherort python.exe programmgesteuert abgerufen?
- 10. Wie wird die Prozessgröße bestimmt?
- 11. Wie kann ein Speicherort von Python Ctypes dereferenziert werden?
- 12. Wie kann die Klasse bestimmt werden, aus der eine bestimmte Methode stammt?
- 13. SQL Express-Verbindungszeichenfolge: Speicherort der MDF-Datei relativ zum Speicherort der Anwendung
- 14. Wie kann DoubleSubmit in einer GWT-Anwendung verhindert werden?
- 15. Notepad ++ Speicherort der gecachten Dateien
- 16. Wie kann Live-Video von einer Java-Anwendung übertragen werden?
- 17. Wie bestimmt Windows (speziell Vista), ob meine Anwendung hängt?
- 18. Wie ist der HDFS-Speicherort auf Hadoop?
- 19. Wie kann die Kommunikation zwischen einer iOS-Anwendung und einer Rails-Anwendung am einfachsten geschützt werden?
- 20. Wie man den Datentyp einer Variablen bestimmt
- 21. Ist Java garantiert String-Konstanten inline, wenn sie zum Zeitpunkt der Kompilierung bestimmt werden kann
- 22. Wie kann der Speichertyp (SAN/NAS/lokale Festplatte) mithilfe von PowerShell remote bestimmt werden?
- 23. Wie kann die Dateicodierung der Datei in hdfs (Azure Blob Storage) bestimmt werden?
- 24. Wie man Notenfrequenzen bestimmt?
- 25. Wie kann die Zeit bestimmt werden, für die das Gerät nicht verwendet wurde?
- 26. Wie wird der Speicherort des Begrüßungsbildschirms geändert?
- 27. Speicherort der Datenbank?
- 28. C++ Builder: Speicherort der Bitmap
- 29. Wie kann die Deinstallation der Anwendung automatisch verhindert werden?
- 30. Wie kann die CPU-Auslastung der WPF-Anwendung reduziert werden?
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
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