C# 获取基本目录的更好方法?

C# 获取基本目录的更好方法?,c#,.net,C#,.net,我有这段代码来加载一个配置文件并读取所有的值,它在运行应用程序时运行良好,但在TeamCity上当然会失败,因为appdomain的基本目录是构建脚本(psake)的启动位置。我知道我可以在执行测试之前将目录更改为build dir,但我认为最好让加载配置文件始终工作 XDocument.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, cfgFile)); 有没有另一种方法可以让“BaseDirectory”一直都有效?我也尝试

我有这段代码来加载一个配置文件并读取所有的值,它在运行应用程序时运行良好,但在TeamCity上当然会失败,因为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成为构建文件/解决方案的位置,而不是构建目录,无论我如何尝试访问它。如果你问我的话,我有点困惑


更新我很想知道,无论启动应用程序域的应用程序位于哪个目录,是否都可以获取程序集的目录。怎么做?

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

我通常使用
AppDomain.CurrentDomain.BaseDirectory

备选方案

  • Path.GetDirectoryName(Assembly.getExecutionGassembly().Location)
  • Environment.CurrentDirectory
试试这个:

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

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

或者()


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

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

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

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

在测试代码中,我们使用:

TestContext.TestDeploymentDir
这是testrun文件夹,测试运行的所有程序集与测试部署项一起复制到该文件夹中。我们将单元测试配置文件“部署”到测试运行文件夹中-这可以在visual studio的testrunconfig对话框中指定

对于我们的生产代码,我们通过

Assembly.GetExecutingAssembly().Location
给为我们工作的构造器。

怎么样:

Application.StartupPath;
根据MSDN:

Assembly.CodeBase属性

将程序集的位置获取为 原指定


获取基本目录的不同方法

  • AppDomain.CurrentDomain.BaseDirectory

  • Directory.GetCurrentDirectory()
    //不保证在移动应用程序上工作

  • Environment.CurrentDirectory
    //这将调用
    Directory.GetCurrentDirectory()

  • this.GetType().Assembly.Location
    //Assembly.Location

  • Application.StartupPath
    //适用于windows窗体应用程序

  • Application.ExecutablePath
    //与
    Application.StartupPath


  • 应用程序启动路径将返回保存exe的路径,我们将使用“\”拆分此路径,并将基本目录获取为“C:”,例如,“基本目录”是什么意思?相对于程序集,配置文件位于何处?如果配置文件与DLL位于同一目录中,那么您的第二个示例应该可以运行……那么您想要.exe所在的目录吗?@craig-是的,这就是我在尝试从程序集中的一个类型中请求代码库后所做的事?例如,
    var path=typeof(SomeClassInMyAssembly).Assembly.CodeBase?谢谢你的建议,但它会产生相同的结果。谢谢你,我以前没有尝试过。它仍然尝试在解决方案目录而不是生成目录中查找xml文件。复制后,您可以在生成目录中注册程序集文件。“如果加载的文件是卷影复制的,则位置是卷影复制后的文件的位置。”/location属性不会给出OP在这种情况下的目标。请注意,这是最好的,如果你打算使用桌面桥我不得不删除dll的名称,但它确实让我的位置在磁盘上的程序集!注意,这会给出一个uri类型的字符串,即。file:///foo/bar/baz.DLL
    
    Assembly.GetExecutingAssembly().Location
    
    Application.StartupPath;
    
    string origAssemblyLocation = Assembly.GetExecutingAssembly().CodeBase;
    
    string baseDirectory=Application.StartupPath.Split(Path.DirectorySeparatorChar)[0];