C#-如何从Program.cs获取Windows上Program.cs所在目录的路径

时间:2018-07-06 19:38:24

标签: c# asp.net-core

我使用.NET Core SDK(v 2.1.301)创建解决方案,创建控制台项目,并将该项目添加到Windows上的解决方案中。

dotnet new sln -o ConsoleSol
dotnet new console -o ConsoleSol/ConsoleApp
dotnet sln ConsoleSol/ConsoleSol.sln add ConsoleSol/ConsoleApp/ConsoleApp.csproj

文件夹结构如下:

ConsoleSol/
├── ConsoleApp
│   ├── bin
│   │   └── Debug
│   │       └── netcoreapp2.1
│   ├── ConsoleApp.csproj
│   ├── obj
│   │   ├── Debug
│   │   │   └── netcoreapp2.1
│   │   └── project.assets.json
│   └── Program.cs
└── ConsoleSol.sln

我想获取到ConsoleSol/ConsoleApp的路径而无需对路径进行硬编码。 我要这样做的原因是为了可以在该目录上创建文件。

如何从Program.cs获取到ConsoleSol/ConsoleApp的路径(即ConsoleApp.csproj和Progam.cs所在的路径)?

我尝试了以下操作:

class Program
{
    static void Main(string[] args)
    {
        var directory = Directory.GetCurrentDirectory();
        Console.WriteLine(directory);
    }
}

但是Directory.GetCurrentDirectory()返回到ConsoleSol/ConsoleApp/bin/Debug/netcoreapp2.1的路径

注意::我没有尝试获取.exe的路径,该路径可以通过调用System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)获得。相反,我试图获取通向Program.cs

的路径

5 个答案:

答案 0 :(得分:1)

由于只有一个人可以获取到.NET执行程序集的路径,并且该程序集可以存储在磁盘上的任何位置,因此无法获得该程序集的任何源文件的路径。当然,除非您从项目中创建的/ bin路径执行。

一旦移动了程序集,您将无法使用其当前路径追溯到用于创建该程序集的源文件的路径。

答案 1 :(得分:0)

答案 2 :(得分:0)

答案 3 :(得分:0)

您可以使用相当新的C#功能“ Caller Information Attributes”来查找文件在编译时的路径。创建一个函数,为其提供一个可选的字符串参数(例如callerPath),并用[CallerFilePathAttribute]进行标记,然后,您将获得包含调用函数的文件的编译时路径(如果调用 without < / em>为该参数指定一个值)。

例如,创建此功能:

private void GetMeThatCallerPath([CallerFilePath] string sourceFilePath = "") {
    LogThePath(sourceFilePath);
}

,然后从要记录其路径的文件中调用它:

GetMeThatCallerPath();

因此,您的LogThePath函数将使用包含GetMeThatCallerPath调用的文件的编译时路径进行调用。

就其价值而言,这些属性确实可以简化日志记录/诊断代码。

答案 4 :(得分:0)

我想您无法在运行时获得此功能,但是在事前和事后事件中,有几个变量可以使用,如果您想做的事情可以在编译之前或之后解决。

其中两个变量是:
$(ProjectDir):projectfolder
$(OutDir):类似"bin\Debug\netcoreapp2.2\"

您可以在项目文件.csproj中指定CMD脚本,例如:

<Project Sdk="Microsoft.NET.Sdk">
   ...
  <Target Name="PostBuild" BeforeTargets="PostBuildEvent">
    <Exec Command="echo &quot;$(ProjectDir)$(OutDir)&quot;"/>
  </Target>
  ...
<Project Sdk="Microsoft.NET.Sdk">