C # под Linux, WorkingDirectory не работает должным образом - PullRequest
0 голосов
/ 02 октября 2018

У меня проблемы с WorkingDirectory, и он неправильно устанавливает желаемый путь.Я написал простую тестовую программу Hello World, a.out, чтобы попробовать WorkingDirectory.И иерархия каталогов такая:

/home/cli2/test
   /bin/Debug/netcoreapp2.1/subdir/
      a.out
   /obj
   Program.cs
   test.csproj

У меня есть следующие настройки для класса Process

process.StartInfo.FileName = "a.out"
process.StartInfo.UseShellExecute = false;
process.StartInfo.WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "/subdir/";

Когда я выполняю dotnet run, я получаю ошибку:

Unhandled Exception: System.ComponentModel.Win32Exception: No such file or directory

Проблема, которая меня смущает, заключается в том, что если я переместу a.out в верхний каталог, такой что:

/home/cli2/project
   /bin/Debug/netcoreapp2.1/subdir/
   /obj
   Program.cs
   test.csproj
   a.out  

При тех же настройках StartInfo, process.start() выполнитпривет программа без ошибокКроме того, если я изменю FileName = "ls" с исходной иерархией подкаталогов, он напечатает a.out.В этом случае WorkingDirectory ведет себя как ожидалось.Итак, я понимаю это несоответствие и почему я не могу позвонить a.out в другой каталог.

Кроме того, я попробовал как абсолютный, так и относительный путь для WorkingDirectory, ни один не работает, когда я звоню a.out.

1 Ответ

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

Значение process.StartInfo.WorkingDirectory в этом случае , а не местоположение исполняемого файла.

Это то, что вызывает поведение, которое вы испытываете, и значение process.StartInfo.WorkingDirectory изменяется в зависимости от значения process.StartInfo.UseShellExecute.


Из документации Microsoft :

Свойство WorkingDirectory работает иначе, когда UseShellExecute имеет значение true, чем когда UseShellExecute имеет значение false.

Когда UseShellExecute имеет значение false, свойство WorkingDirectory не используется для поиска исполняемого файла.Вместо этого его значение применяется к процессу, который запущен и имеет значение только в контексте нового процесса.


Значение по умолчанию для UseShellExecute в ядре dotnet - false.Я сталкивался со странными вещами при установке UseShellExecute на true в Linux.

Лично я бы оставил значение false и обязательно использовал полный путь или путь относительно корневого каталога проекта, например:

process.StartInfo.FileName="bin/Debug/netcoreapp2.1/subdir/a.out";

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...