使用csi.exe执行.csx脚本时,如何获取脚本自身路径?
获取CSX脚本自身路径(csi.exe执行场景)
我之前也碰到过这个痛点!用csi.exe运行.csx脚本时,AppDomain.CurrentDomain.BaseDirectory确实只会返回解释器本身的路径,根本拿不到脚本自己的位置。不过好在有几种靠谱的方法能解决这个问题,而且和#r指令的相对路径逻辑完全一致。
方法一:解析命令行参数(最可靠)
当你用csi.exe执行脚本时,脚本文件的路径肯定会作为命令行参数传入,我们只需要把它提取出来就行:
using System; using System.IO; using System.Linq; // 遍历命令行参数,找到第一个非选项的参数(即脚本路径) var scriptPath = Environment.GetCommandLineArgs() .Skip(1) // 跳过第一个参数(csi.exe的路径) .First(arg => !arg.StartsWith("/")); // 排除以/开头的选项参数 // 获取脚本所在的绝对目录 var scriptDirectory = Path.GetFullPath(Path.GetDirectoryName(scriptPath)); Console.WriteLine($"脚本文件路径:{scriptPath}"); Console.WriteLine($"脚本所在目录:{scriptDirectory}");
这个方法的优势在于兼容性极强,不管你是用老版本的MSBuild下的csi,还是.NET Core/.NET 5+的csi都能生效。而且它和#r指令的路径逻辑完全匹配——#r "..\bla\asdf.dll"就是基于这个脚本目录来解析的。
补充:处理特殊场景
如果你的脚本是通过标准输入执行的(比如csi.exe < yourscript.csx),那这个方法就失效了,但这种场景在实际开发中很少见,大部分时候都是直接指定脚本文件路径运行。
内容的提问来源于stack exchange,提问作者chtenb
相关产品推荐
相关产品推荐

