181

我正在尝试完成这个异常处理程序:

if (ConfigurationManager.ConnectionStrings["ConnectionString"]==null)
{
    string pathOfActiveConfigFile = ...?
    throw new ConfigurationErrorsException(
       "You either forgot to set the connection string, or " +
       "you're using a unit test framework that looks for  "+
       "the config file in strange places, update this file : " 
       + pathOfActiveConfigFile);
}

这个问题似乎只发生在我使用 nUnit 时。

4

8 回答 8

375

试试这个

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
于 2009-04-27T14:18:03.907 回答
67

严格来说,没有单一的配置文件。除了 ASP.NET 1之外,可以有三个使用内置 ( System.Configuration) 支持的配置文件。除了机器配置:app.exe.config,用户漫游和本地用户。

要获取“全局”配置(exe .config):

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

ConfigurationUserLevel为每次使用的漫游和非漫游配置文件使用不同的值。


1它具有完全不同的模型,其中子文件夹(IIS 虚拟或文件系统)的内容web.config可以(取决于设置)添加到或覆盖父文件夹的web.config.

于 2009-04-27T14:36:09.587 回答
9

如果您的意思是在使用 NUnit 时只得到空返回,那么您可能需要将应用程序的 app.config 中的 ConnectionString 值复制到测试库的 app.config 中。

当它由测试加载器运行时,测试程序集在运行时加载,并将查看它自己的 app.config(在编译时重命名为 testAssembly.dll.config)而不是您的应用程序配置文件。

要获取您正在运行的程序集的位置,请尝试

System.Reflection.Assembly.GetExecutingAssembly().Location
于 2009-04-27T14:13:19.690 回答
6

确保单击文件上的属性并将其设置为“始终复制”,否则它将不会与您的快乐 lil dll 一起位于 Debug\ 文件夹中以配置它需要的位置并添加更多牛铃

于 2009-04-27T14:23:56.560 回答
6

我第一次意识到单元测试项目引用了该项目中的 app.config,而不是与我的生产代码项目(当然,DOH)关联的 app.config,我只是在 Prod 项目的 Post Build Event 中添加了一行这会将 app.config 复制到测试项目的 bin 文件夹中。

问题解决了

到目前为止,我还没有注意到任何奇怪的副作用,但我不确定这是正确的解决方案,但至少它似乎有效。

于 2009-05-06T20:46:09.560 回答
4

我看到的另一个选项在这里丢失:

const string APP_CONFIG_FILE = "APP_CONFIG_FILE";
string defaultSysConfigFilePath = (string)AppDomain.CurrentDomain.GetData(APP_CONFIG_FILE);
于 2017-02-01T12:43:41.477 回答
3

根据您的配置文件的位置,System.Reflection.Assembly.GetExecutingAssembly().Location可能会满足您的需要。

于 2009-04-27T14:14:04.320 回答
3

我在 Web 应用程序(实际上是本地运行的 Azure Web 角色)中尝试了之前的答案之一,但效果不佳。但是,这种类似的方法确实有效:

var map = new ExeConfigurationFileMap { ExeConfigFilename = "MyComponent.dll.config" };
var path = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None).FilePath;

配置文件原来在 C:\Program Files\IIS Express\MyComponent.dll.config 中。有趣的地方。

于 2014-06-17T21:03:23.767 回答