Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#脚本中的#r指令不支持相对路径_C#_Reference_.net Assembly_Roslyn - Fatal编程技术网

C#脚本中的#r指令不支持相对路径

C#脚本中的#r指令不支持相对路径,c#,reference,.net-assembly,roslyn,C#,Reference,.net Assembly,Roslyn,根据这篇文章: #r指令可以与相对路径一起使用,但这是一篇老文章,我没有找到任何相关的最新文档(昨天整个下午都在搜索) 当我提供完整的绝对路径时,我可以添加我的程序集的引用,但它不适用于相对路径 dll位于运行脚本的当前目录中(通过运行脚本中的Environment.CurrentDirectory验证): 我尝试了所有这些形式: #r ".\MyLib.dll" #r "MyLib.dll" #r "D:\Absolute\Path\To\MyLib.dll" 只有最后一个起作用了 我正在

根据这篇文章:

#r
指令可以与相对路径一起使用,但这是一篇老文章,我没有找到任何相关的最新文档(昨天整个下午都在搜索)

当我提供完整的绝对路径时,我可以添加我的程序集的引用,但它不适用于相对路径

dll位于运行脚本的当前目录中(通过运行脚本中的
Environment.CurrentDirectory
验证):

我尝试了所有这些形式:

#r ".\MyLib.dll"
#r "MyLib.dll"
#r "D:\Absolute\Path\To\MyLib.dll"
只有最后一个起作用了

我正在使用从NuGet检索的Roslyn库:

Microsoft.CodeAnalysis.CSharp.Scripting
版本3.1.0


是否已删除对相对路径的支持?

脚本的脚本运行程序从何处执行


如果您通过命令行使用
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#交互式窗口加载文件,则它是
C:\Users\
,而不是脚本的文件路径


如果您正在使用引用Microsoft.CodeAnalysis.CSharp.Scripting库的自定义应用程序,则
Environment.CurrentDirectory
将是自定义应用程序的文件位置,而不是脚本的文件位置

解决此问题的一种方法是在调用
CSharpScript.evaluatesync()
之前,将
Environment.CurrentDirectory
设置为与脚本文件的文件目录相同(我假设您的自定义应用程序代码会知道它是否正在加载文件)

例如,在自定义应用程序中,您可以执行以下操作:

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);
使用Microsoft.CodeAnalysis.CSharp.Scripting;
// ...

var scriptDirectory=@“c:\dir1\path\to\script”;// 我也面临着这个问题,经过一番挖掘,我在github上找到了解决方案。我现在找不到链接,但如果我再次找到它,我将进行更新

根据github上对该问题的回答,只有在直接执行脚本文件时,相对路径才会起作用。Roslyn不再使用
Environment.CurrentDirectory
搜索库。问题是,当使用CSharpScript.evaluateSync时,您没有运行脚本文件,而是在计算字符串,因此roslyn甚至不会尝试解析任何相对路径

解决方案是在ScriptOptions中提供文件的路径:

var scriptCode = File.ReadAllText(scriptFilepath);

var opt = ScriptOptions.Default
            .WithFilePath(scriptFilePath);

var result = await CSharpScript.EvaluateAsync(scriptCode, options: opt);
这解决了我的问题,相对路径现在是相对于脚本文件的路径来解决的


更新:链接到github上的问题

我使用的是C#代码。来自我们自己的应用程序,该应用程序支持使用.csx文件进行自定义。我正在该应用程序中使用NuGet Microsoft.CodeAnalysis.CSharp.Scripting中的库,并使用库方法运行脚本:CSharpScript.EvaluateAsync()我在脚本中创建了Environment.CurrentDirectory,因此在脚本的“范围”中,该目录是脚本站点上的正确目录。(与我要引用的dll所在的位置相同)。@FrancisP Ok。谢谢你的澄清。与我最初的回答类似,听起来像是
Environment.CurrentDirectory
是从引用
Microsoft.CodeAnalysis.CSharp.Scripting
库的自定义应用程序的上下文运行的。具体地说,是指应用程序所在的文件路径和启动位置,而不是脚本所在的位置。请参阅我的更新答案以了解可能的修复方法。刚刚测试并确认,尽管在执行脚本之前更改了
环境,但带有相对路径的
#r
仍不起作用。CurrentDirectory
:(