C# 用于脚本文件的脚本 (csx) 位置

C# for scripting (csx) location of script file

在 F# 中,使用预定义标识符非常容易 __SOURCE_DIRECTORY__

但是,此标识符在 C# 脚本(csx 文件或 C# Interactive)中不起作用。

> __SOURCE_DIRECTORY__

(1,1): error CS0103: The name '__SOURCE_DIRECTORY__' does not exist in the current context

以更传统的方式获取当前目录也不起作用。

  1. Directory.GetCurrentDirectory()

    Returns: C:\Users$USER_NAME$\

  2. new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;

    Returns: C:\Program Files (x86)\Microsoft Visual Studio17\Professional\Common7\IDE\CommonExtensions\Microsoft\ManagedLanguages\VBCSharp\InteractiveComponents\

在 C# 中,您可以利用 caller information 属性(自 C# 5 / VS2012 起可用)。只需像这样声明一个方法:

string GetCurrentFileName([System.Runtime.CompilerServices.CallerFilePath] string fileName = null)
{
    return fileName;
}

并且在不指定可选参数的情况下调用它:

string scriptPath = GetCurrentFileName(); // /path/to/your/script.csx

在 csx 中,您可以添加 ExecutionContext 作为参数并从中访问 FunctionDirectory,如下所示:

using System;
using Microsoft.Azure.WebJobs;

public static void Run(TimerInfo myTimer, ExecutionContext executionContext, ILogger log) {
    var dir = executionContext.FunctionDirectory;

    log.LogInformation($"Directory: {dir}");
}

ExecutionContext.FunctionDirectory 将 return 包含函数的 function.json 文件的目录。它不包括尾随 .

此时 this 似乎是 ExecutionContext 的最佳文档。


我正在尝试自己寻找这个问题的答案,这是我之前的答案。

在csx中,下面的辅助方法将return目录"of the source file that contains the caller".

using System.IO;

...

public static string CallerDirectory([System.Runtime.CompilerServices.CallerFilePath] string fileName = null)
{
    return Path.GetDirectoryName(fileName);
}

要调用它,请不要指定 fileName 参数。

var dir = CallerDirectory();