it-swarm.com.de

C # Wie erhalte ich den aktuellen Verzeichnispfad?

Szenario: Ich habe ein Bibliotheksprojekt erstellt, das eine Schnittstelle zum Installationsprogramm (exe, die mit Installationsschild erstellt wurde) bereitstellt. Ich möchte prüfen, ob eine bestimmte Datei im Installationsordner vorhanden ist.

Ich habe folgendes versucht:

1).  Assembly.GetEntryAssembly().Location

// Löst aus "Objektverweis, der nicht auf eine Instanz eines Objekts festgelegt ist"

2). new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath

// Rückkehr : C:\Windows\Microsoft.Net\Assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll

3). Assembly.GetExecutingAssembly().Location

// gibt eine leere Zeichenfolge zurück

4). AppDomain.CurrentDomain.BaseDirectory

// gibt "C:\Windows\syswow64 \" unabhängig vom tatsächlichen Pfad zurück

Könnte mir jemand sagen, wie ich den Verzeichnispfad von dem Installationsprogramm aus erhalten kann?

3
Vishwas Trivedi

Ich werde meine eigene Frage beantworten. Es ist nicht möglich, den aktuellen Pfad aus dem Bibliotheksprojekt zu erhalten. Sie müssen es vom Installer bekommen. Es geht nicht anders.

Vielen Dank.

0
Vishwas Trivedi

Sie können verwenden

Directory.GetCurrentDirectory();

um den aktuellen Verzeichnispfad abzurufen

System.IO importieren

3
Mostafiz

Angenommen, Sie führen eine von InstallShield erstellte MSI-basierte Installation aus:

Das Problem, das Sie haben, liegt in der Funktionsweise dieser Anrufe. Sie implementieren dies in einer externen DLL, und DLLs haben kein eigenes aktuelles Verzeichnis - sie haben das aktuelle Verzeichnis des Prozesses, der in der DLL aufgerufen wird. In diesem Fall werden Sie von einem msiexec.exe-Prozess aus aufgerufen (vorausgesetzt, Sie tun dies in einer benutzerdefinierten Aktion), sodass Sie das aktuelle Verzeichnis von msiexec.exe erhalten. 

Abgesehen davon einige andere Bemerkungen:

  1. Sie sagen nicht genau, wann Sie Ihren Code aufrufen, aber es kann sein, dass der Benutzer den Installationsordner ausgewählt hat. Daher hilft die Suche nicht wirklich.

  2. InstallShield unterstützt wahrscheinlich eine Dateisuche. Wenn dies ein MSI-Setup ist, ist dies definitiv der Fall. 

  3. Installationen suchen selten nach Dateien in einem Installationsordner, da es selten einen guten Grund gibt. Wenn Sie die Datei benötigen, fügen Sie sie Ihrer Installation hinzu. Wenn es sich um eine weitervertreibbare Datei handelt, fügen Sie das Standard-Redist-Paket hinzu, möglicherweise ein Merge-Modul. Wenn diese Datei zu einem anderen Setup gehört, was werden Sie tun, wenn das Produkt deinstalliert wird? Prüfen Sie, ob die Version mit Ihrer Anwendung kompatibel ist? Im Allgemeinen installieren alle Setups die benötigten Dateien, und freigegebene Dateien sind abwärtskompatibel, wenn sie von mehreren verschiedenen Produkten verwendet werden. 

1
PhilDW

Wenn Sie den Ordner erhalten möchten, in dem sich Ihr Exe befindet

AppDomain.CurrentDomain.BaseDirectory

dies gibt den gesamten Pfad zum Ordner zurück, in dem sich das Exe befindet. Von dort aus können Sie Ihre Ordner manuell hinzufügen

AppDomain.CurrentDomain.BaseDirectory + @"MyFolder1\MyFolder2";
0
Shmosi

Wenn Sie diesen Pfad in InstallShield verwenden möchten, verwenden Sie diesen

Setup.exe - Verwenden Sie die SETUPEXEDIR-Eigenschaft

http://www.installshield.com/news/newsletter/0206-articles/SetupExeDir.asp .

Probieren Sie je nach Version von installhield unterschiedliche Eigenschaften aus

1. SRCDIR

2. SETUPEXEDIR

3. SUPPORTDIR

Wenn Sie einen C # -Code zum Lesen von Preperties haben, verwenden Sie MsiGetProperty wie unten

MsiGetProperty (hMSI, "SETUPEXEDIR", Wert, Größe)

0
ManishM

Probieren Sie es aus, es funktioniert immer für mich: 

Environment.CurrentDirectory

verwenden Sie die obigen Eigenschaften wie folgt.

string currentDirectory = Path.GetDirectoryName(Environment.CurrentDirectory);
0
ksdev