ArgumentException:在脚本中使用CallerFilePath属性时,“路径不是合法形式”

时间:2018-08-07 23:10:43

标签: c# roslyn

上下文

我正在尝试从一个程序中以编程方式运行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)
    • 我检查了似乎是implementation的地方
      • 我手动检查了csx文件的路径; csx的路径中没有无效的路径字符,也没有通配符。
  • 我检查了mscorlib没有参考问题
  • ScriptOptions(我的第一个示例代码中的referencesAndUsings)中也许缺少了一些东西,我看了一下,但是……我似乎对所有事情都不太了解

    • 我创建ScriptOptions(“ referencesAndUsings”)的方式如下所示:

    var myOptions = ScriptOptions.Default; myOptions.AddReferences(new List<string>() { ... }); myOptions.AddImports(new List<string>() { ... });

  • ThisCallerFilePath属性的文档

  • This是呼叫者信息概念的文献

真正让我难过的是它在C#Interactive中有效。

问题

有人知道我的ScriptRunner.exe解释为什么它不希望工作吗?以及如何使其工作?

1 个答案:

答案 0 :(得分:0)

var state = await CSharpScript.RunAsync<int>(script, referencesAndUsings, globalArgs);

script是脚本本身(csx文件的内容)。因此,它没有路径。 CSharpScript对您的csx文件的路径一无所知。当您从脚本中调用GetCurrentFileName时,没有路径信息。

您需要使用FilePathScriptOptions中指定一个WithFilePath(csxFilePath)