C # Как получить текущий путь к каталогу - PullRequest
0 голосов
/ 14 сентября 2018

Сценарий: Я создал проект библиотеки, который предоставляет интерфейс для установщика (exe, созданный с помощью Install Shield). Я хочу проверить, существует ли определенный файл в папке установщика.

Я пробовал следующее:

1).  Assembly.GetEntryAssembly().Location

// Выдает "Ссылка на объект не установлена ​​для экземпляра объекта"

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

// возврат: C: \ Windows \ Microsoft.Net \ сборка \ GAC_32 \ mscorlib \ v4.0_4.0.0.0__b77a5c561934e089 \ mscorlib.dll

3). Assembly.GetExecutingAssembly().Location

// возвращает пустую строку

4). AppDomain.CurrentDomain.BaseDirectory

// возвращает «C: \ Windows \ syswow64 \» независимо от фактического пути

Может кто-нибудь сказать мне, как я могу получить путь к каталогу, откуда выполняется установщик?

Ответы [ 6 ]

0 голосов
/ 03 октября 2018

Я отвечу на свой вопрос. Невозможно получить текущий путь из библиотечного проекта. Вы должны будете получить это от установщика. Другого пути нет.

Спасибо.

0 голосов
/ 14 сентября 2018

Предполагается, что вы запускаете установку на основе MSI, созданную InstallShield:

Проблема, которую вы испытываете, заключается в том, как эти вызовы работают.Вы реализуете это во внешнем Dll, и у Dll нет собственного текущего каталога - у них есть текущий каталог процесса, который вызывает Dll.В этом случае вы вызываетесь из процесса msiexec.exe (при условии, что вы делаете это в пользовательском действии), поэтому вы получите текущий каталог msiexec.exe.

Помимо этого, некоторые другие наблюдения:

  1. Вы не говорите точно, когда вызываете свой код, но это может произойти до того, как пользователь выбрал установкупапка, поэтому поиск не очень помогает.

  2. InstallShield, вероятно, обеспечивает поддержку поиска файлов.Если это настройка MSI, то это точно так.

  3. При установке практически не выполняется поиск файлов в папке установки, поскольку на это редко есть веская причина.Если вам нужен файл, добавьте его в вашу установку или, если он распространяется, то добавьте стандартный пакет redist, возможно, модуль слияния.Если этот файл принадлежит другой настройке, что вы будете делать, если этот продукт будет удален?Вы проверяете версию, чтобы увидеть, совместима ли она с вашим приложением?Как правило, все установки устанавливают нужные им файлы, а общие файлы обратно совместимы, если они используются несколькими различными продуктами.

0 голосов
/ 14 сентября 2018

Если вы хотите, чтобы этот путь в InstallShield использовал это

Setup.exe - используйте свойство SETUPEXEDIR

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

В зависимости отиспользуемую версию installshield попробуйте другие свойства

1.SRCDIR

2.SETUPEXEDIR

3.SUPPORTDIR

Если у вас есть код C # для чтения свойств, используйте MsiGetProperty, как показано ниже

MsiGetProperty (hMSI, "SETUPEXEDIR", Значение, Размер)

0 голосов
/ 14 сентября 2018

Попробуйте это, у меня всегда работает:

Environment.CurrentDirectory

используйте вышеуказанное свойство следующим образом.

string currentDirectory = Path.GetDirectoryName(Environment.CurrentDirectory);
0 голосов
/ 14 сентября 2018

Если вы хотите получить папку, в которой находится ваш exe-файл

AppDomain.CurrentDomain.BaseDirectory

, это возвращает полный путь к папке, содержащей exe-файл.Оттуда вы можете добавлять свои папки вручную

AppDomain.CurrentDomain.BaseDirectory + @"MyFolder1\MyFolder2";
0 голосов
/ 14 сентября 2018

Вы можете использовать

Directory.GetCurrentDirectory();

чтобы получить текущий путь к каталогу

импорт System.IO

...