使用C#控制台应用程序获取应用程序目录?

使用C#控制台应用程序获取应用程序目录?,c#,console,directory,C#,Console,Directory,我在谷歌上找到了一些东西,但它在C#控制台应用程序上不起作用 我发现: string appPath = Path.GetDirectoryName(Application.ExecutablePath); 如何使用c#控制台应用程序获取应用程序目录?试试看控制台应用程序无法使用该应用程序,它是针对windows窗体的 要获取工作目录,可以使用 Environment.CurrentDirectory 此外,要获取可执行文件的目录,您可以使用: AppDomain.CurrentDomain

我在谷歌上找到了一些东西,但它在C#控制台应用程序上不起作用

我发现:

string appPath = Path.GetDirectoryName(Application.ExecutablePath);

如何使用c#控制台应用程序获取应用程序目录?

试试看

控制台应用程序无法使用该应用程序,它是针对windows窗体的

要获取工作目录,可以使用

Environment.CurrentDirectory
此外,要获取可执行文件的目录,您可以使用:

AppDomain.CurrentDomain.BaseDirectory

如果仍要在控制台应用程序中使用Application.ExecutablePath,则需要:

  • 添加对System.Windows.Forms命名空间的引用
  • 将System.Windows.Forms添加到“使用”部分

    using System;
    using System.IO;
    using System.Windows.Forms;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string appDirectory = Path.GetDirectoryName(Application.ExecutablePath);
                Console.WriteLine(appDirectory);
            }
        }
    }
    
  • 您还可以使用而不是
    Path.GetDirectoryName(Application.ExecutablePath)
    ,因此您不需要对System.Windows.Forms的引用


    如果您既不想包含
    System.IO
    也不想包含
    System.Windows.Forms
    名称空间,那么您应该遵循Reimeus的答案。

    注意,路径有几种方法和陷阱

    • 你在找什么地方?工作目录,.EXE目录,DLL目录

    • 您希望代码也在服务或控制台应用程序中工作吗

    • 如果目录的尾部斜杠不一致,代码是否会中断

    让我们看看一些选项:

    Application.ExecutablePath
    
    需要添加引用并加载应用程序命名空间

    Directory.GetCurrentDirectory
    Environment.CurrentDirectory
    
    如果程序是通过快捷方式、注册表、任务管理器运行的,则这些将提供“开始位置”文件夹,该文件夹可能与.EXE位置不同

    AppDomain.CurrentDomain.BaseDirectory
    
    取决于它的运行效果,它是否包含尾部斜杠。这可能会破坏一些东西,例如GetDirectoryName()认为没有斜杠是文件,并将删除最后一部分

    我的建议是,在表单和控制台应用程序中都可以使用这两种方法:

    var AssemblyPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
    or
    var AssemblyPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
    

    在主程序中使用时,两者都是相同的。如果在DLL中使用,第一个返回加载DLL的.EXE目录,第二个返回DLL目录。

    我知道这已经很长时间了,但是
    Assembly.GetExecutingAssembly().CodeBase
    对我有效。您只需用它替换
    应用程序.ExecutablePath

    当然,您必须使用System.Reflection添加


    我尝试过使用
    System.Windows.Forms
    ,但它给了我一个异常

    -1
    AppDomain.CurrentDomain.BaseDirectory可能有一个斜杠,也可能没有,这取决于应用程序的启动方式
    如何处理
    路径。合并
    ?你以前没听说过吗?@Kilanny为什么投反对票?是的路径。联合收割机负责斜线,但如果您不连接路径怎么办?例如,将目录传递给命令行程序,其中斜杠可以更改行为。让
    Path.combined
    放在一边,为什么不像在
    Assembly.Location
    上那样调用
    Path.GetDirectoryName
    BaseDIrectory
    ?@或者为迟来的答复感到抱歉。由于尾部斜杠不一致,GetDirectoryName()可能会将BaseDirectory视为文件路径,从而导致它删除路径的最后一部分。我已经更新了我的答案以使其更清晰。-1因为
    目录。GetCurrentDirectory()
    获取当前工作目录,而不是包含应用程序的目录。@Sam但我还是喜欢这样。我不想依赖表单。-1,因为
    Directory.GetCurrentDirectory()
    获取当前工作目录,而不是包含应用程序的目录。