Директива #r в скрипте C # не поддерживает относительные пути - PullRequest
0 голосов
/ 11 июня 2019

Согласно этому посту: Есть ли способ настроить рабочий каталог для команд загрузки "r и"

Директиву #r можно использовать с относительным путем, но это старый пост, и мне не удалось найти какую-либо актуальную недавнюю документацию по этому вопросу (искал вчера весь день)

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

DLL находится в текущем каталоге запущенного скрипта (проверено с помощью Environment.CurrentDirectory из запущенного скрипта):

Я перепробовал все эти формы:

#r ".\MyLib.dll"
#r "MyLib.dll"
#r "D:\Absolute\Path\To\MyLib.dll"

Работал только последний.

Я использую библиотеку Roslyn, полученную из NuGet:

Microsoft.CodeAnalysis.CSharp.Scripting

Версия 3.1.0

Была ли удалена поддержка относительного пути?

1 Ответ

0 голосов
/ 12 июня 2019

Откуда выполняется исполнитель сценария?


Если вы используете csi.exe через командную строку , например:

C:\dir1>csi.exe .\path\to\script\myScript.csx 

Environment.CurrentDirectory будет текущим каталогом, в котором был запущен csi.exe (т. Е. c:\dir1), а не файлом сценария (т. Е. c:\dir1\path\to\script).


Если вы используете Интерактивное окно Visual Studio C # - #load, то это файл c:\Users\<your user name>, а не путь к файлу сценария.


Если вы используете пользовательское приложение со ссылкой на библиотеку Microsoft.CodeAnalysis.CSharp.Scripting , тогда Environment.CurrentDirectory будет файлом вашего пользовательского приложения , а не сценария.

Чтобы решить эту проблему, установите Environment.CurrentDirectory таким же, как каталог файлов вашего файла сценария (который, как я полагаю, ваш пользовательский код приложения будет знать, загружает ли он файл каким-либо образом) до CSharpScript.EvaluateAsync() называется.

Например, в своем пользовательском приложении вы можете сделать следующее:

using Microsoft.CodeAnalysis.CSharp.Scripting;
// ...

            var scriptDirectory = @"c:\dir1\path\to\script"; // <-- or however else you are getting this. will use this later
            var scriptFilename = "myScript.csx";
            var scriptFilepath = Path.Combine(scriptDirectory, scriptFilename);

            var scriptCode = File.ReadAllText(scriptFilepath);

            Environment.CurrentDirectory = scriptDirectory; // <-- set this before running the script below

            var result = await CSharpScript.EvaluateAsync(scriptCode);

К сожалению, после тестирования на себя, даже после изменения Environment.CurrentDirectory, как предложено в Есть лиспособ настроить рабочий каталог для команд загрузки r и #r по-прежнему не работает при использовании относительного пути.Если это сработало, то да, похоже, что это регрессия с тех пор, как этот ответ был первоначально опубликован.

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