如何防止Visual Studio向我的web.config文件中添加程序集?

24
每次我构建或发布网站时,Visual Studio 都会尝试签出 web.config 文件,以便添加许多不必要的程序集。
换句话说: web.config 原来的样子:
<configuration>
   <system.web>
      <compilation>
         <assemblies>
         </assemblies>
      </compilation>
   </system.web>
</configuration>

web.config之后:

<configuration>
   <system.web>
      <compilation>
         <assemblies>
             <add assembly="Microsoft.ReportViewer.Common... />
             <add assembly="Microsoft.ReportViewer.WinForms... />
             <add assembly="System.DirectoryServices... />
             <add assembly="System.Windows.Forms... />
             <add assembly="ADODB... />
             <add assembly="System.Management... />
             <add assembly="System.Data.OracleClient... />
             <add assembly="Microsoft.Build.Utilities... />
             <add assembly="Microsoft.ReportViewer.ProcessingObjectModel... />
             <add assembly="System.Design... />
             <add assembly="Microsoft.Build.Framework... />
         </assemblies>
      </compilation>
   </system.web>
</configuration>

这些程序集都不是必需的,大多数在目标测试或生产服务器上不存在。

每次构建时我都会将它们删除,但这真的变得非常烦人。

现在我的解决方法是将web.config设置为只读,这样Visual Studio就无法向其中添加程序集。


更新

以下是证明截图:

项目属性页面之前:

link text

Web.Config之前:

alt text

项目属性页面之后:

alt text

修改后的 Web.config:

alt text

更新二

需要明确指出的是,该网站可以在不添加这些无关引用的情况下正常运行。我的临时解决方案是将web.config设置为只读,并且每当Visual Studio尝试修改它时,点击取消。如果我能够阻止Visual Studio首先尝试修改它...


更新三

看起来不可能。如果有人知道正确答案,可以随意回答,"你无法阻止Visual Studio向你的web.config添加程序集。" 我会标记它。

我保留这个问题的唯一原因是希望有人知道超级秘密选项、注册表键或项目或解决方案设置,告诉Visual Studio停止思考。


更新四

我没有接受已接受的答案,如果可以的话,我会取消接受。我仍然希望找到解决办法。但现在我倾向于以下方案:

  • 答案:无法完成 (manu08)
  • 解决方法:过滤 GAC 程序集注册表键 (Nebakanezer)

我该如何停止Visual Studio向我的web.config文件中添加程序集?

参考资料


我也遇到了这个问题,它不仅仅是一种挫败感,而且它完全阻止了网站的编译。我引用了一个存在于GAC中的程序集,有x86和x64两个版本。VS将它们都下载到我的/bin目录中,并将它们放在web.config中。现在,由于32位的ASPNET编译器进程试图加载x64程序集,因此网站无法验证。真是疯狂! - Sebastian Good
16个回答

6
也许“Avatar DotNet Library”自己正在引用那些程序集。正确部署项目需要引用已引用程序集的引用。否则,已引用程序集如何工作呢?
请注意,您引用的程序集可能不使用自己的引用,尽管它们存在。
编辑:您可以使用优秀的工具“.Net Reflector”来检查这一点。

Avatar DotNet Library确实引用了那些程序集。但是,被引用程序集的引用并不需要正确部署项目,因为这些被引用的程序集从未被使用过。 - Ian Boyd
5
好的,我明白了。但从逻辑上讲,Visual Studio会添加那些程序集,因为它们很可能会被使用。如果Avatar Dot Net是一个可以修改的项目,我建议您重新设计架构并将其分成不同的程序集,并将所有未使用的引用放入一个新的程序集中,您不需要在项目中引用该程序集。 - Juan Calero
该解决方案的问题是,juancalero,它将分成不同的程序集。我们将不是只有一个dll,而是有10或20个。 - Ian Boyd
问题仍然存在,如何阻止 Visual Studio 做它认为最好的事情。 - Ian Boyd
我认为你无法做到(或者解决方案太复杂了)。如果你无法让它工作,就使用你最喜欢的解决方法。这就是我的回答原因。我试图给你提供一个对我有效的解决方法。 - Juan Calero

4

我使用VS2005编辑了一个.net 1.1 (VS2003)的.aspx文件并保存后,会神秘地将net.2.0程序集添加到web.config文件中:

但如果我使用VS2008或VS2010,则不会发生这种情况。因此,我认为这是VS2005 IDE的一个错误。


3

我曾在使用Visual Studio 2005时遇到过这个问题(但很高兴地报告,以下加粗文本的解决方案同样适用于VS 2008)。在将程序集添加到web.config文件之前,VS会检查注册表中的一个部分。

以下是关键:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Projects\{E24C65DC-7377-472B-9ABA-BC803B73C61A}\FilteredGACReferences

假设您不希望Visual Studio将Microsoft.VisualStudio.Designer.Interfaces程序集添加到您的web.config中。请在注册表中添加以下条目,然后您就可以设置好了。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Projects\{E24C65DC-7377-472B-9ABA-BC803B73C61A}\FilteredGACReferences\Microsoft.VisualStudio.Designer.Interfaces

对我来说,它完美地发挥了作用。是的,你的团队其他成员也必须这样做,但至少你不必每次手动删除条目 :)

要使其适用于VS 2008 - 只需将注册表路径中的8.0更改为9.0即可


听起来是个好主意,但需要将其添加到每个人的计算机上,并定期更新。 - Ian Boyd
虽然这对于微软来说是一件可怕的事情,但似乎这是唯一实际可行的解决方案。 - Sebastian Good
看起来这个解决方案在这里被阐述了,为了给予应有的荣誉。http://davidovitz.blogspot.com/2006/03/webconfig-contains-assembly-references.html - Sebastian Good

2

将你的“Web Site”项目转换为“Web Application”项目。

“Web Site”没有项目文件,因此所有程序集引用都包含在web.config中。而“Web Project”有一个项目文件,并且所有引用都存储在项目文件中。


1

移除引用。

  • 如果是 Web 应用程序:您可以在 Solution Explorer 下查看引用。

  • 如果是网站:右键单击解决方案资源管理器中的项目,然后选择 属性页。在那里管理它们。

希望对您有所帮助。


1
啊,我把它们从网站的“属性页面”中删除了,但它们在下一次构建时又出现了。 - Ian Boyd

1
如果一个共享程序集引用了它们,那么它们也会被添加到调用项目中。
由于Avatar库涉及到这些其他引用,Visual Studio也将这些引用添加到了主项目中。否则,对Avatar库的调用可能会失败,因为它所需的引用丢失了。

可能可以,但实际上不会这么做。如果有人忘记在 Web 服务器上放置程序集,我也可以接受因加载延迟而引发错误的情况。 - Ian Boyd

1

抱歉,您无法阻止Visual Studio向您的web.config添加程序集,但并非一切都已经失去。

我曾经遇到过这种情况;有人将一些引用(包括WinForms)添加到了低级别数据访问程序集中。网站使用了低级别数据访问程序集,因此在web.config文件中添加了WinForms等内容。

解决方案是将他的代码移动到正确的程序集中,并删除错误的引用。

如果您无法确定哪个程序集具有不需要的引用,并且您知道自己没有调用依赖于不需要的引用的代码,则可以采取以下措施(这些都不是很好):

  • 编写自定义安装操作,自动从web.config中删除这些不需要的程序集引用
  • 编写自定义MSBUILD操作,在构建时删除它们
  • 在应用程序安装时使用不同的手写web.config文件。

找出Visual Studio为什么要向web.config文件添加引用可能需要很长时间。您必须手动检查每个直接或间接使用的程序集。


哦,天啊。这会引发一系列问题,涉及到为什么Visual Studio和Subversion被设计成它们现在的样子。 - Ian Boyd

1

我知道并欣赏微软在ASP.NET 2.0中发明Web Sites的原因,但有时它们确实很烦人。如果你能做到,将您的网站转换为Web Application Project,这样问题就会消失。

如果这对你来说不现实,请尽可能将代码重构为单独的类库项目。任何你可以从网站中移出并移到类库中的引用都将减少web.config更改。

编辑:为了澄清,在Web Site中,aspnet编译器编译所有内容(标记、代码后台等),因此所有程序集引用都必须放入web.config。但是,在Web Application Project中,C#或VB编译器将代码后台文件编译成一个单独的DLL,然后当aspnet编译器编译标记时引用该DLL。在这种情况下,仅在代码后台文件中引用的程序集将进入代码后台DLL,并且不会接触web.config。只有在标记中直接引用的程序集才会进入web.config


我至少需要知道什么是Web应用程序项目。它是带有.cs代码后台文件的WebForms吗? - Ian Boyd
Web应用程序项目是一个普通项目,具有普通的项目文件,只是发生在IIS或VSDS中,包含aspx文件和web.config文件。Web站点是一种奇怪的结构,其中Visual Studio只是从磁盘上文件夹的内容中猜测您项目中的内容。没有项目文件。描述所有差异需要填写几页文本,因此这里是一个链接 - http://msdn.microsoft.com/en-us/library/ms227432.aspx - Christian Hayter

1

这可能看起来像是一个hack,但考虑到您的要求,另一个选项是在运行时使用Assembly.Load或LoadFrom动态加载Avatar程序集。这将使主项目中的引用保持参考,并应该防止web.config中的额外引用行。然而,如果您只使用了Avatar项目中的少量类,则这只有实际意义。我会创建第三个项目,两个项目都引用它,其中包含一个或多个Avatar类实现的接口,以便主项目在处理Avatar实例时保持严格类型。我承认这可能比之前提交的答案需要更多的工作。如果您对此方法感兴趣,请搜索在.Net中创建插件的谷歌。


1
只要你使用的是网站而不是 Web 应用程序,我就不知道有什么办法可以阻止 Visual Studio 向 web.config 文件添加程序集。我公司的解决方案也存在类似的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接