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
:(