如何阻止Visual Studio向我的web.config添加程序集?

问题描述 投票:24回答:16

每次构建或发布网站时,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中?

参考

visual-studio assemblies web-config dependencies
16个回答
4
投票

我使用VS2005编辑.net 1.1(VS2003).aspx并保存它,然后web.config将神秘地拥有网络。添加了2.0个组件:

如果我使用VS2008或VS2010,则不会发生这种情况。所以我相信这是VS2005 IDE中的一个错误。


1
投票

抱歉,您无法阻止Visual Studio向您的web.config添加程序集,但所有程序都不会丢失。

我过去打过这个;有人在低级数据访问程序集中添加了一些引用(包括WinForms)。该网站使用了低级数据访问程序集,因此在Web.config文件中添加了WinForms等。

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

如果您无法对具有不需要的引用的程序集进行排序,并且您知道您没有调用依赖于不需要的引用的代码。那么你可以(这些都不好)

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

可能需要很长时间才能找到Visual Studio添加对web.config文件的引用的原因。您必须手动检查由网站直接或间接使用的每个程序集。


1
投票

我知道并理解为什么微软在ASP.NET 2.0中发明了网站,但有时它们只是简单的吮吸。如果它对您来说很实用,请将您的站点转换为Web应用程序项目,这样的问题就会消失。

如果这对您不切实际,请尝试将尽可能多的代码重新分配到单独的类库项目中。您可以移出网站并进入类库的任何引用都将减少web.config的更改。

编辑:为了澄清,在网站上,aspnet编译器编译所有内容(标记,代码隐藏,批次),因此所有程序集引用必须进入web.config。但是,在Web应用程序项目中,C#或VB编译器将代码隐藏文件编译为单独的DLL,然后在编译标记时由aspnet编译器引用。在这种情况下,仅在代码隐藏文件中引用的程序集将进入代码隐藏DLL而不会触及web.config。只有在标记中直接引用的程序集才会进入web.config


0
投票

我不相信您可以阻止Visual Studio自动添加对其他人引用的程序集的引用。

一种解决方案是使用自定义操作创建Web安装项目,该操作可自动从web.config中删除这些不需要的程序集引用。


0
投票

这些是您的项目所需的所有程序集,在某种形状或庄园中,以及ASP.NET在运行时对您的页面执行的编译。它们可能是由您在项目中使用的代码或使用它们的其他库导入的。

但根据documentation。这些是在全局web.config中定义的程序集,可以在C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG中找到:

<assemblies>
    <add assembly="mscorlib" />
    <add assembly="System, ..." />
    <add assembly="System.Configuration, ..." />
    <add assembly="System.Web, ..." />
    <add assembly="System.Data, ..." />
    <add assembly="System.Web.Services, ..." />
    <add assembly="System.Xml, ..." />
    <add assembly="System.Drawing, ..." />
    <add assembly="System.EnterpriseServices, ..." />
    <add assembly="System.Web.Mobile, ..." />
    <add assembly="*" />
</assemblies>

如果你看,有一个assembly="*"参考被添加。如果你读了关于这个命令的documentation,它说:

(可选)您可以指定星号(*)通配符以在应用程序的专用程序集缓存中添加每个程序集,该应用程序位于应用程序的\ bin子目录中或.NET Framework安装目录中(%systemroot%\ Microsoft.NET \框架\版本)。

这意味着/ bin目录或.NET Framework安装目录中的任何程序集都将包含在内。

这告诉我你的问题是,那些被包含的程序集已经以某种方式引用到你的项目中。它们可能来自Avatar Dot Net Library或您网页上的某些控件。检查Avatar Library上Visual Studio项目中的“References”文件夹,查找您不想要的这些引用。因为这是构建过程从中获取这些库的地方。

换句话说,如果您不希望它们被包含在内,请擦除这些库的所有引用的引用项目。

或者,每次运行构建过程时,您都可以使用MSBuild XML解析器删除web.config的该部分。我个人使用一个名为XmlUpdate的任务来修改我的web.config的某些部分,以使其生产就绪。如果你想做同样的事情,那就是MSBuild Community Tasks的一部分。


0
投票

如果您在vista或Server 08计算机上运行,​​则可以使用appcmd命令行实用程序在重建后将其删除,而不是手动删除它。

http://technet.microsoft.com/en-us/library/cc772200(WS.10).aspx http://learn.iis.net/page.aspx/114/getting-started-with-appcmdexe/


0
投票

http://msdn.microsoft.com/en-us/library/ms178728.aspx

在那里解释了你在属性页中看到的并不是全部,在Machine.config文件中也存在隐式引用,并在编译时添加。希望这可以帮助。


-3
投票

我首先检查代码文件中的“using”语句以及.aspx,.ascx文件中的任何引用。听起来你已经引用了其中的一些(我知道默认情况下会从Add New Item模板中添加一些。


6
投票

也许“阿凡达DotNet库”本身就是引用这些组件。需要引用程序集的引用才能正确部署项目。否则,引用的程序集如何工作?

请注意,引用的程序集可能不使用自己的引用,尽管它们存在。

编辑:您可以使用伟大的工具“.Net Reflector”来检查这一点。


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


2
投票

将“Web站点”项目转换为“Web应用程序”项目。

“Web站点”没有项目文件,因此它包含web.config中的所有程序集引用。 “Web项目”具有项目文件,所有引用都存储在项目文件中。


1
投票

删除参考。

  • 如果是Web应用程序:您可以在Solution Explorer下看到References。
  • 如果是网站:右键单击解决方案资源管理器上的项目,然后选择属性页。在那里管理它们。

HTH


1
投票

如果共享程序集引用它们,那么它们也将被添加到调用项目中。

由于Avatar库提供了这些其他引用,因此Visual Studio也会将这些引用添加到主项目中。否则,对Avatar库的调用可能会失败,因为缺少所需的引用。


1
投票

好吧这看起来像是一个黑客,但考虑到你的要求,另一个选择是在运行时使用Assembly.Load或LoadFrom动态加载头像组件。这将保留主项目的引用,然后应该阻止web.config中的额外引用行。如果您只使用Avatar项目中的少量类,这只会非常实用。我将制作第三个项目,两个项目都引用了一个或多个Avatar类实现的接口,以便主项目在处理Avatar实例时保持严格的输入。我承认这可能是以前提交答案的更多工作。如果您对此方法感兴趣,请搜索谷歌在.Net中创建插件


1
投票

只要您使用的是网站,而不是webapp,我就不知道有什么方法可以阻止Visual Studio向您的web.config添加程序集。我公司的解决方案也存在同样的问题。


1
投票

您无法阻止Visual Studio向web.config添加程序集。

© www.soinside.com 2019 - 2024. All rights reserved.