我正在尝试从一个程序中以编程方式运行C#脚本(.csx文件),在这里我将调用ScriptRunner.exe
并且我写了我自己(因为csi.exe
不会输出我想要的内容)。 ScriptRunner.exe
是一个简单的控制台应用程序,其最有趣的功能是具有以下行:
var state = await CSharpScript.RunAsync<int>(script, referencesAndUsings, globalArgs);
ScriptRunner.exe
很棒!但是...
当我的脚本包含以下行的那一刻:
static string GetCurrentFileName([System.Runtime.CompilerServices.CallerFilePath] string fileName = null) { return fileName; }
尤其是[System.Runtime.CompilerServices.CallerFilePath]
,我得到一个 ArgumentException:“该路径不是合法形式” ;请注意,如果我通过#load
命令在C#Interactive中使用同一行,则后者不会出现-该命令正确显示了.csx文件的路径。
at System.IO.Path.LegacyNormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)
mscorlib
没有参考问题在ScriptOptions(我的第一个示例代码中的referencesAndUsings
)中也许缺少了一些东西,我看了一下,但是……我似乎对所有事情都不太了解>
ScriptOptions
(“ referencesAndUsings
”)的方式如下所示: var myOptions = ScriptOptions.Default;
myOptions.AddReferences(new List<string>() { ... });
myOptions.AddImports(new List<string>() { ... });
This是CallerFilePath
属性的文档
真正让我难过的是它在C#Interactive中有效。
有人知道我的ScriptRunner.exe
解释为什么它不希望工作吗?以及如何使其工作?
答案 0 :(得分:0)
在
var state = await CSharpScript.RunAsync<int>(script, referencesAndUsings, globalArgs);
script
是脚本本身(csx文件的内容)。因此,它没有路径。 CSharpScript对您的csx文件的路径一无所知。当您从脚本中调用GetCurrentFileName
时,没有路径信息。
您需要使用FilePath
在ScriptOptions
中指定一个WithFilePath(csxFilePath)