获取基目录的更好方法是什么?

时间:2010-07-02 05:47:21

标签: c# .net

我有这个代码来加载配置文件并读取所有值,它在运行应用程序时工作正常但当然在团队城市失败,因为appdomain的基本目录是构建脚本(psake)的启动位置。我知道我可以在执行测试之前将目录更改为build dir,但我认为最好不管是否一直在加载配置文件。

XDocument.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, cfgFile));

还有另一种方法可以让“BaseDirectory”真正起作用吗?我也尝试了以下相同的结果:

string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);
XDocument.Load(Path.Combine(path, cfgFile));

编辑1 问题如下。我的解决方案基目录是“C:\ Project”,所有编译的文件都复制到“C:\ Project \ build”。现在在psake构建脚本中,我有以下代码:

task Test -depends PrepareTests {
    try { 
        #$old = pwd
        #cd $build_dir
        &$mspec $mspec_projects --teamcity
        #cd $old
    }
    catch {
        &echo "Error starting test runner"
        Exit 1;
    }      
}

正如您所看到的,我注释掉了目录的更改,这使得BaseDirectory成为构建文件/解决方案的位置而不是构建目录,无论我如何尝试访问它。如果你问我,会有点混乱。

更新我真的很想知道是否可以获取程序集的目录,无论启动应用程序域的应用程序位于何种目录中。怎么样?

9 个答案:

答案 0 :(得分:20)

获取基本目录的不同方法

  1. AppDomain.CurrentDomain.BaseDirectory

  2. Directory.GetCurrentDirectory() //无法保证可以使用移动应用

  3. Environment.CurrentDirectory //这会调用Directory.GetCurrentDirectory()

  4. this.GetType().Assembly.Location // Assembly.location

  5. Application.StartupPath //适用于Windows表单应用

  6. Application.ExecutablePath //与Application.StartupPath

  7. 相同

答案 1 :(得分:8)

你的问题有点不清楚。我真的不知道这是不是你想要的。

我通常使用AppDomain.CurrentDomain.BaseDirectory

<强>替代

  • Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
  • Environment.CurrentDirectory

答案 2 :(得分:8)

所以听起来/看起来你正在尝试获取程序集的配置文件。以下内容应通过访问程序集的“Location”属性并使用它来检索配置路径来完成该任务:

static string GetConfigFileByType(Type type)
{
    Configuration config = 
        ConfigurationManager.OpenExeConfiguration(type.Assembly.Location);

    if (config.HasFile)
        return config.FilePath;
    throw new FileNotFoundException();
}

答案 3 :(得分:8)

答案 4 :(得分:1)

试试这个:

  Module[] modules = Assembly.GetExecutingAssembly().GetModules();
  return Path.GetDirectoryName(modules[0].FullyQualifiedName);

答案 5 :(得分:1)

您是否尝试过获取当前进程的文件名“MainModule

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName

GetEntryAssembly()?

System.Reflection.Assembly.GetEntryAssembly().Location

答案 6 :(得分:1)

我喜欢让我的类可配置 - 例如,他们在其构造函数中将文件夹名称作为参数。 这使得可以使用不同的配置文件进行测试。

在测试代码中我们使用:

TestContext.TestDeploymentDir

这是testrun文件夹,其中测试运行的所有程序集与测试部署项一起被复制到其中。我们将单元测试配置文件部署到测试运行文件夹 - 这可以在visual studio的testrunco​​nfig对话框中指定。

我们的生产代码通过

Assembly.GetExecutingAssembly().Location

到构造函数,它适用于我们。

答案 7 :(得分:1)

答案 8 :(得分:0)

string baseDirectory=Application.StartupPath.Split(Path.DirectorySeparatorChar)[0];

应用程序启动路径将返回保存exe的路径,我们将使用&#34; \&#34;并将基目录作为&#34; C:&#34;例如,