我经常使用的VS解决方案包括单个可执行项目(控制台应用程序,Web应用程序)和许多类库项目,这些都是可执行文件引用的。
使用NuGet并安装软件包时,通常会为每个项目创建一个app.config
文件,通常只包含一个合并重定向列表,用于合并引用程序集的版本。有时候会有一些第三方特定于图书馆的内容(比如实体框架配置部分),但是现在暂且不谈。
当我构建解决方案并使用主可执行项目的二进制文件时,我看到构建输出中的所有类库项目程序集以及相应的*.config
文件(app.config
文件被重命名建成后AssemblyName.config
。
启动主可执行文件时,类库程序集的配置文件是否有效?或者只是可执行文件的app.config
文件在这种情况下有效?如果在某些类库项目上设置了一些绑定重定向,并在主可执行项目上设置了一些不同的绑定重定向 - 这些如何组合,哪些优先呢?
我试图在线研究这个问题,从我读过的内容来看,我认为非可执行程序集的app.config
文件是无用的(关于绑定重定向)。有人可以确认这一点,或者对该主题进行详细说明吗?
如果是这样的话,如果它们只包含绑定重定向,那么在类库中创建Nuget创建的这些app.config
文件实际上是不可取的吗?我觉得NuGet不应该为类库项目创建那些绑定重定向,因为它只会增加对实际应用的设置的混淆。
我在这个主题上发现了这些现有的Stack Overflow问题,但是他们接受的答案实际上是矛盾的,即使它们被标记为彼此重复。
Why NuGet adds app.config with assemblyBinding to LIBRARY projects during a NuGet package update?
Is the bindingRedirect .config file needed or all assemblies in an application?
The accepted answer to the first question提到app.config文件实际上是在编译时使用的,这意味着它们可以生效。像MSDN和MSBuild source code这样的来源被引用作为它在编译时使用的证明。不幸的是,我对MSBuild的熟练程度不足以理解它是如何被使用的,以及它是否真的是一个有效的论据。
答案 0 :(得分:3)
我有多个具有类似设置的应用程序 - Web应用程序引用多个库项目,每个项目都有自己的nuget包等。根据我的个人经验,在运行时不考虑库项目中的程序集绑定。
在根应用程序(Web /控制台)中指定web或app config的绑定是唯一重要的。我的所有库项目都设置为“复制到输出目录”设置为“不要复制”app.config文件 - 这样我的输出文件夹不会与dll及其配置文件混乱。
Here is the link说明了如何加载程序集以及搜索的位置和顺序。没有在文章中他们谈论个别项目配置文件。
希望有所帮助。
答案 1 :(得分:2)
应用程序配置文件是用于控制程序集绑定的XML文件。它可以将应用程序从一个版本的并排程序集重定向到同一程序集的另一个版本。这称为每个应用程序配置。应用程序配置文件仅适用于特定的应用程序清单和从属程序集。使用嵌入式[ ISOLATIONAWARE_MANIFEST_RESOURCE_ID ]清单编译的隔离组件需要单独的应用程序配置文件。使用CreateActCtx管理的清单需要单独的应用程序配置文件。
因此,只有ISOLATIONAWARE_MANIFEST_RESOURCE_ID
集的dll实际上使用了独立的应用程序配置,否则它会延迟到主进程配置文件。
有关ISOLATIONAWARE的更多信息,请阅读更深入的other MSDN article。
ISOLATIONAWARE_MANIFEST_RESOURCE_ID主要用于DLL。它 如果dll想要除了之外的私有依赖项,应该使用 进程默认。例如,如果dll依赖于comctl32.dll 版本6.0.0.0。它应该具有类型为RT_MANIFEST,ID的资源 ISOLATIONAWARE_MANIFEST_RESOURCE_ID依赖于comctl32.dll版本 6.0.0.0,这样即使进程可执行文件需要comctl32.dll版本5.1,dll本身仍然会使用正确的版本 COMCTL32.DLL。
答案 2 :(得分:0)
通常只有一个配置文件,即可执行的配置文件(.exe.config,web.config)。
任何程序集重定向都必须放在可执行文件的配置文件中。
需要使用ConfigurationManager类手动加载dll的配置文件。另请参阅此问题Equivalent to 'app.config' for a library (DLL)
答案 3 :(得分:0)
不,只有可执行文件的app.config
才会生效。例如,如果您有一个托管WCF服务的控制台应用程序,并且在您的WCF服务中使用,例如ConfigurationManager.AppSettings
,则AppSettings将来自控制台主机app.config
文件。如果您启动另一个控制台应用程序(ConsoleClient)以尝试连接到ConsoleHost,那么在可以说是ConsoleClient的部分中,执行" (例如,在其主要方法中),它将使用ConsoleClient的app.config
,但是一旦它开始使用WCF服务,WCF服务将委托使用ConsoleHost {{1} }。 (请注意,最后一点与WCF背后的细节更相关。)
答案 4 :(得分:0)
答案是也许。库文件的类型取决于项目的类型。一些库项目在尊重库的配置文件的环境中运行(例如,Azure Web角色),但这不是规范。
有关更多详细信息,请参见我的答案here。