2011-10-21 39 views
0

我们现在有4人正在致力于解决方案。该解决方案由一个中央可执行项目(Windows服务)和许多类库解决方案组成。 Windows服务有一个app.config文件,但由于某种原因,“复制到输出目录”设置被设置为“不要复制”,因此我们可以在此讨论中忽略它。需要一种方法来控制app.config文件

有两个不同的类库项目具有app.config文件。在其中一个项目中,这将作为MyClassLibrary.dll.config复制到bin \ Debug文件夹中,而另一个DLL的bin \ Debug文件夹中同时包含MyOtherClassLibrary.dll.config和app.config。我不确定这是怎么发生的。

这些是解决方案中的所有app.config文件。

解决方案中有一个MSTest项目。它有几个具有[TestClass]属性的类,每个类都有自己的.cs文件。当我看着这个项目的bin \ Debug文件夹时,我在其中找到MyClassLibrary.dll和App.config,但没有找到MyOtherClassLibrary.dll。这很奇怪,但这就是我所看到的。

当我去运行这些测试之一时,如您所知,文件被复制到解决方案的TestResults文件夹中的特殊测试文件夹中。当我查看该文件夹时,我只找到一个MyTestProject.dll.config文件。当我打开它时,它的内容是app.config文件的内容。

这是怎么回事?我认为Visual Studio将所有的配置文件合并在一起?缺少来自MyClassLibrary.dll.config文件(显然)的设置会破坏依赖它的代码。

我们如何解决这个问题?

托尼

编辑:

我只是双重检查的MyClassLibrary斌\ Debug文件夹&同时具有的app.config & MyClassLibrary.dll.config,所以我想我是看到在MyOtherClassLibrary是正常的。我们只需要一种方法来管理所有这些设置。

+0

从来没有任何自动合并。这一切都必须手动完成。 –

回答

0

您应该只需要一个配置文件,它可以是正在执行的项目(即控制台项目,Web应用程序项目等)的一部分。如果来自其中一个类库的类正在引用一个配置值,则它应该具有对正在执行的项目的访问权限/范围。我从来没有见过任何自动合并。

+0

不知道我在哪里得到了多个配置文件将被合并的想法。无论如何,这显然是错误的,因为所有已经回答的人都告诉我。所以,实质上,如果TEST项目中有一个app.config文件,那么当TST将bin文件夹复制到TESTRESULTS文件夹时,该文件将胜过所有其他DLL。这是正确的吗? –

1

不,VS不会合并配置文件。它不这样做,因为可以有一个解决方案生成两个或更多可执行文件作为项目。即使对于总是以类库形式出现并且只有一个可执行文件的项目,由于关注点分离,合并应用程序配置文件并不是一个好主意;项目库应该是一个“黑盒子”,引用代码只需要通过实例化方法和调用方法的外部接口。一个app.config及其信息根据定义是一个实现细节,只有需要它的项目应该知道,而不是引用它的项目。此外,如果你从另一个可执行文件中独立重新编译项目库,并推出新的DLL,那么将如何合并配置文件呢?

如果一个项目有一个app.config,将会为该项目专门创建一个配置,并与其他项目分开。

如果你的配置具有公共段的公用数据,你可以通过为这些段指定一个外部配置文件,并使用“configSource”属性从每个项目的“主”配置文件中引用它来最大限度地减少冗余数据量。

+0

我们猜测你所说的这些“configSource”属性会进入Assembly.info,但我们似乎无法找到任何“configSource”属性。你能详细说明这些事情发生在哪里以及他们叫什么名字? –

+0

configSource属性放在app.config中,用于将一个配置文件“链接”到另一个。因此,您可以在两个项目的配置文件中使用相同的configSource,并且具有相同的数据而不会有重复。 – KeithS

0

只需记住,是用这样的(包括web.config文件和文件的app.config)配置文件发生了两两件事:

  1. 您作为是部署的文件。它可能会进行转换,但文件将按照原样进行部署。

  2. 它被编译为属于程序集。所以,我的项目命名为ProjectOne将有它的App.Config中文件编制,并更名为ProjectOne.dll.config(假设我总成ProjectOne是“ProjectOne”)

这是重要的,因为它的所有关于范围。这种重命名是设计的,因为它仍然允许项目组件首先访问它自己的配置文件。这些将优先于来自场景1的实际app.config的优先级。

通过更改文件的属性以避免MSBuild不接触文件,您可以防止出现方案2。然后它可能会尝试按原样部署它。在这种情况下,它会根据构建顺序覆盖之前部署的任何部分。

相关问题