如何找到活动 app.config 文件的路径?

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

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 时。

160236 次浏览

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

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

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

System.Reflection.Assembly.GetExecutingAssembly().Location

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

试试这个

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

请确保您点击文件上的属性,并设置为“复制始终”,否则它将不会在 Debug 文件夹与您高兴的 lil dll 的配置它需要在哪里,并添加更多的 Cowbell

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

要获得“ global”配置(前任.config) :

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
.FilePath

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


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

我第一次意识到 Unit 测试项目引用了该项目中的 app.config,而不是与我的生产代码项目相关的 app.config (偏离轨道,DOH)时,我只是在 Prod 项目的 Post Build Event 中添加了一行,将 app.config 复制到测试项目的 bin 文件夹中。

问题解决了

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

我在一个 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 ent.dll.config 中。

我看到的另一个选择是:

const string APP_CONFIG_FILE = "APP_CONFIG_FILE";
string defaultSysConfigFilePath = (string)AppDomain.CurrentDomain.GetData(APP_CONFIG_FILE);