Откуда выполняется исполнитель сценария?
Если вы используете 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
по-прежнему не работает при использовании относительного пути.Если это сработало, то да, похоже, что это регрессия с тех пор, как этот ответ был первоначально опубликован.