获取程序集执行目录的最佳方法是什么

时间:2008-10-31 13:29:57

标签: .net directory

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

我发现了".\\"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,但是,当我检索它而不确定它是否已被更改时)

编辑:我注意到一个相关的问题早就发布了。 What would cause the current directory of an executing app to change?

谢谢大家的回答。

7 个答案:

答案 0 :(得分:43)

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))

答案 1 :(得分:12)

尝试以下实施。 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);
    }
}

答案 2 :(得分:10)

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

如果你想要工作目录,或Path.GetDirectoryName(typeof(Foo).Assembly.ManifestModule.FullyQualifiedName)找到一个程序集的位置(或者至少它的清单模块,几乎在所有情况下它都是相同的),那就有Environment.CurrentDirectory。 / p>

答案 3 :(得分:5)

还有,

System.Reflection.Assembly.GetExecutingAssembly().CodeBase

答案 4 :(得分:4)

有点短:

AppDomain.Current.BaseDirectory

答案 5 :(得分:2)

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

string path;
path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );
MessageBox.Show( path );

答案 6 :(得分:1)

怎么样

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

然后从那里弄清楚......