21

对于我的应用程序,我将一些配置文件与程序集(exe)一起存储在 xml 中,以及用于处理目的的其他临时文件。

".\\"我发现and有一些怪癖Application.StartupPath

我一直在使用

String configPath = ".\\config.xml";

它工作正常,直到我打电话OpenFIleDialog打开其他文件夹中的一些文件,上面的语句失败了。显然“.\”指的是“CurrentDirectory”,每次我们浏览到另一个文件夹时它都会改变。

在某些时候,我正在使用

String configPath = Path.Combine(Application.StartupPath + "config.xml");

在某些时候,当我需要通过使用从另一个文件夹执行这个程序集时Process.Start(),事情开始分崩离析。显然工作目录设置不正确,Application.StartupPath实际上是指工作目录,而不是我假设的程序集正在执行的目录。所以我不得不求助于使用 ProcessInfo 将工作目录设置为程序集的目录。我在写 VSTO 时也遇到了这个问题。

所以,我的问题是,在没有我刚才提到的那些怪癖(或误解)的情况下,获取程序集正在执行的当前目录的最佳、最简单和最可靠的方法是什么?

编辑:我的意思是获取程序集所在的目录

编辑:根据AppDomain.BaseDirectory上的 MSDN ,它似乎可以在运行时更改,这是我不想要的(只是为了澄清,不是我不想允许更改 BaseDirectory,而是当我在不确定是否已更改的情况下检索它)

编辑:我注意到一个相关问题发布得更早。什么会导致正在执行的应用程序的当前目录发生变化?

谢谢大家的回答。

4

7 回答 7

48
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))
于 2008-10-31T13:40:04.703 回答
15

试试下面的实现。CodeBase 属性是获取位置的最可靠方法,然后其余代码将其转换为标准 Windows 格式(而不是 URI)。

static public string AssemblyLoadDirectory
{
    get
    {
        string codeBase = Assembly.GetCallingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
    }
}
于 2008-11-12T16:10:08.670 回答
10

你想要实际的工作目录,还是包含程序集的目录?这并不完全清楚。

如果Environment.CurrentDirectory您想要工作目录,或者Path.GetDirectoryName(typeof(Foo).Assembly.ManifestModule.FullyQualifiedName)查找程序集的位置(或者至少是它的清单模块,这在几乎所有情况下都是一样的)。

于 2008-10-31T13:34:56.587 回答
5

还有,

System.Reflection.Assembly.GetExecutingAssembly().CodeBase
于 2008-10-31T13:39:00.557 回答
5

短一点:

AppDomain.Current.BaseDirectory
于 2008-10-31T13:44:59.390 回答
2

我会从以下链接尝试这样的事情:

string path;
path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );
MessageBox.Show( path );
于 2008-10-31T13:40:05.967 回答
1

怎么样

string currentAssemblyFile = System.Reflection.Assembly.GetExecutingAssembly().Location;

然后从那里弄清楚...

于 2008-10-31T13:39:36.670 回答