我使用.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
答案 0 :(得分:1)
由于只有一个人可以获取到.NET执行程序集的路径,并且该程序集可以存储在磁盘上的任何位置,因此无法获得该程序集的任何源文件的路径。当然,除非您从项目中创建的/ bin路径执行。
一旦移动了程序集,您将无法使用其当前路径追溯到用于创建该程序集的源文件的路径。
答案 1 :(得分:0)
两次调用Path.GetDirectoryName
进入当前目录。
https://msdn.microsoft.com/en-us/library/system.io.path.getdirectoryname(v=vs.110).aspx
答案 2 :(得分:0)
System.Reflection.Assembly.GetExecutingAssembly().Location
如果只需要目录,请用System.IO.Path.GetDirectoryName
组合起来。
答案 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 "$(ProjectDir)$(OutDir)""/>
</Target>
...
<Project Sdk="Microsoft.NET.Sdk">