我经常使用的VS解决方案包括一个可执行项目(控制台应用程序,Web应用程序)和许多可执行文件引用的类库项目.
在使用NuGet并安装软件包时,通常会app.config为每个项目创建一个文件,通常只包含合并重定向列表,这些重定向合并了引用程序集的版本.有时候会有一些特定于第三方库的内容(比如Entity Framework配置部分),但是现在让我们把它放在一边.
当我构建解决方案并使用主可执行项目的二进制文件时,我会看到构建输出中的所有类库项目程序集以及相应的*.config文件(app.config文件AssemblyName.config在构建时重命名为).
启动主可执行文件时,类库程序集的配置文件是否有效?或者只是app.config在这种情况下具有效果的可执行文件?如果在某些类库项目上设置了一些绑定重定向,并在主可执行项目上设置了一些不同的绑定重定向,这些如何组合,哪些优先?
我试图在网上研究这个,从我读过的内容来看,它看起来像app.config非可执行程序集的文件是无用的(关于绑定重定向).有人可以确认这一点或详细说明这个主题吗?
如果是这样的话,app.config如果它们只包含绑定重定向,那么实际上不希望NuGet在类库中创建这些文件吗?我觉得NuGet不应该为类库项目创建那些绑定重定向,因为它只会增加对实际应用的设置的混淆.
我在这个主题上发现了这些现有的Stack Overflow问题,但是他们接受的答案实际上是矛盾的,即使它们被标记为彼此重复.
第一个问题的接受答案提到app.config文件实际上是在编译时使用的,这意味着它们可能有效.像MSDN和MSBuild源代码这样的来源被引用作为它在编译时使用的证明.不幸的是,我对MSBuild的熟练程度不足以理解它是如何被使用的,以及它是否真的是一个有效的参数.
我有一个内部NuGet包,其中包含一个dll,没有外部NuGet包依赖项,也没有web.config转换.
然而,当我在我的项目(类lib和网站)上为这个特定的NuGet运行Update-Package时,它会自动更新我的网站web.config程序集绑定重定向到旧版本的System.Web.Mvc和Newtonsoft.Json.web.config网站目前已将它们绑定到正在使用的最新版本.
使用GUI,利用管理NuGet包进行解决方案...我选择为具有旧版本引用的适用项目更新此NuGet.然后选择更新
以下是Package Manager的输出:http://pastebin.com/3ySwTRFR
我的web.config来自:
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-5.1.0.0" newVersion="5.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)
至:
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.1" newVersion="4.0.0.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="4.5.0.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)
我正在更新的NuGet包有一个引用Newtonsoft.Json的dll(但是没有明确地使用NuGet包依赖)
当不知情的开发人员更新这个NuGet包时,它会破坏运行时寻找旧版本的MVC或JSON.NET dll.
在过去,我尝试使用-IgnoreDependencies powershell命令开关,但这似乎对该问题没有影响.
在update-package期间有什么可以改变我的web.configs(没有显式转换)的想法?
编辑:VS2015与NuGet 3.3.0似乎表现得更好...在随机软件包更新期间,它发现了一个旧的BAD绑定重定向并更正了它! 
asp.net-mvc json.net nuget assembly-binding-redirect visual-studio-2013
我有一个Azure Web角色,我想在web.config下<appSettings>标记一些设置.是的,我知道服务配置文件,但我有理由更喜欢web.config.
当我执行时(从这里):
System.Configuration.Configuration rootWebConfig =
System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(null);
if (rootWebConfig1.AppSettings.Settings.Count > 0) {
}
Run Code Online (Sandbox Code Playgroud)
设置计数始终为零,尽管我已经添加了一个键值对<appSettings>.
我究竟做错了什么?是否可以从Web角色入口点读取web.config中的设置?
使用NuGet为具有多个dll和一个exe的解决方案安装Microsoft.Bcl.Async包,该解决方案使用所有其他dll,NuGet自动为每个项目创建一个.config文件(或添加到现有文件)Bcl包被添加到.
在实践中,我最终得到了> 20个包含相同重定向的配置文件.我理解重定向是必需的,但这实际上是所有程序集所必需的,因为它们都是由单个应用程序加载的(如果重要的话,其中一些是由Prism加载的)?我从输出目录中删除了所有.config文件,只留下app.config,应用程序似乎工作正常.我的假设是正确的,一旦bindingRedirect在启动应用程序时生效,加载到该域的所有其他程序集也会自动使用重定向吗?或者有任何警告吗?我问的主要原因是要知道在重新分发应用程序时是否应该包含所有这些配置文件.
nuget ×3
.net ×2
app-config ×2
c# ×2
asp.net-mvc ×1
azure ×1
json.net ×1
settings ×1
web-config ×1