c# Executable执行目录
本文关键字:执行 Executable | 更新日期: 2023-09-27 18:05:07
获取c#可执行文件运行路径的最佳方法是什么?
我需要将其用于临时文件夹等,目前我使用:
Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase)
然后我需要做a:
.Replace("file:''", string.Empty)
,因为这给了我一个URI类型的路径(即有file:'在开始),这是不可用的一些其他部分的代码。
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
不是对你问题的准确回答,但是我建议你看一下:
Path.GetTempFileName()
http://msdn.microsoft.com/en-us/library/system.io.path.gettempfilename.aspx 尝试使用Environment.CurrentDirectory
返回当前工作目录的文件夹。
对于临时文件夹等,出于安全原因,不应该使用执行目录…MS有一些内置的东西:
你可以使用ApplicationData
(漫游用户)或LocalApplicationData
(非漫游用户)或CommonApplicationData
(非用户相关的东西)从Environment.SpecialFolder
-任何(文件+文件夹)你在这些文件夹中创建的已经设置与运行你的应用程序的用户所需的权限/权利-没有人(除了管理员)可以去那里…为了使它更安全,你可以加密你放在那里的数据…
见http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx
尝试:
Application.StartupPath
它应该返回不包含可执行文件名的路径
如果程序集已被影子复制,则Assembly.Location
将指向dll的影子副本。
如果您想知道构建输出目录的位置,请使用Assembly.CodeBase
,即:
Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath)
如果您想从程序集目录访问其他资源,例如在运行测试套件时,
- 。. NET Core 3.0引入
IHostEnvironment.ContentRootPath
. - 。. NET Core 2.1引入了
IHostingEnvironment.ContentRootPath
(自Core 3.0以来已废弃)。
就我个人而言,我发现这些是我通常需要的:包含内容的位置。
我可以确认IHostEnvironment.ContentRootPath
在作为单元测试运行时也返回所需的结果。(使用xUnit进行测试,但测试框架应该不重要)
对于自包含的单文件应用程序(从。net Core 3.0开始可用),您应该使用System.AppContext.BaseDirectory
。程序集位置将为空,因此您不能依赖它。
using System.Reflection;
Console.WriteLine($"AppContext.BaseDirectory: {AppContext.BaseDirectory}");
Console.WriteLine($"Assembly.Location: {Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)}");
Console.ReadLine();
using System.Reflection;
Console.WriteLine($"AppContext.BaseDirectory: {AppContext.BaseDirectory}");
Console.WriteLine($"Assembly.Location: {Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)}");
Console.ReadLine();
输出(未公布):
AppContext.BaseDirectory: C:'[..]'bin'Debug'net6.0-windows'win-x64'
Assembly.Location: C:'[..]'bin'Debug'net6.0-windows'win-x64
输出(发布/单一文件):
AppContext.BaseDirectory: C:'[..]'bin'Debug'net6.0-windows'win-x64'publish'
Assembly.Location:
string executableLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);string txtfile =路径。结合(executableLocation example.txt);