代码之家  ›  专栏  ›  技术社区  ›  Ian Boyd

如何停止Visual Studio向web.config添加程序集?

  •  24
  • Ian Boyd  · 技术社区  · 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 http://i26.tinypic.com/206c46c.jpg

    web.config之前:

    alt text http://i31.tinypic.com/30rr728.jpg

    之后的项目属性页:

    alt text http://i27.tinypic.com/25a3z2x.jpg

    web.config之后:

    alt text http://i32.tinypic.com/2pq6w4w.jpg

    更新2

    应该明确指出,在没有添加这些无关引用的情况下,网站是可以工作的。我的临时解决方案是保持web.config为只读,然后点击 取消 每当Visual Studio抱怨它在尝试修改时是只读的。如果我能先阻止Visual Studio修改它…


    更新三

    看起来是不可能的。有人可以自由地给出正确的答案。” 不能停止Visual Studio向web.config添加程序集 “我会做记号的。

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


    更新四

    我没有接受被接受的答案,如果可以的话,我也不会接受。我仍然希望有灵丹妙药。但现在我倾向于:


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

    工具书类

    16 回复  |  直到 13 年前
        1
  •  4
  •   stevey    13 年前

    我用vs2005编辑了一个.net 1.1(vs2003.aspx并保存了它,然后web.config会神秘地拥有网络。2.0添加的组件:

    如果我使用VS2008或VS2010,则不会发生这种情况。所以我认为这是VS2005IDE中的一个bug。

        2
  •  6
  •   Juan Calero    16 年前

    也许“avatar dotnet库”自己引用了这些程序集。 正确部署项目需要引用程序集的引用。 否则,引用的程序集如何工作?

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

    编辑:你可以使用伟大的工具“.net reflector”来检查这个。

        3
  •  3
  •   Mark Sherretta    16 年前

    我在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

        4
  •  2
  •   Pete    16 年前

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

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

        5
  •  1
  •   Ian Boyd    16 年前

    删除引用。

    • 如果它是一个Web应用程序:您可以看到下面的引用 解决方案管理器 .

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

    高温高压

        6
  •  1
  •   David    16 年前

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

    由于avatar库生成了这些其他引用,因此Visual Studio也将这些引用添加到主项目中。否则,调用avatar库可能会失败,因为它需要的引用丢失。

        7
  •  1
  •   Tim Santeford    16 年前

    好吧,这看起来像是一个黑客,但是考虑到您的需求,另一个选择是在运行时使用assembly.load或loadfrom动态加载avatar程序集。这将使引用远离主项目,然后应防止web.config中的额外引用行。但是,如果您只使用来自avatar项目的少量类,那么这将非常实用。我将创建第三个项目,两个项目都引用了包含一个或多个实现的avatar类的接口,以便主项目在处理avatar实例时保持严格的类型。我承认这可能是更多的工作,以前提交的答案。如果您对这个方法感兴趣,请在谷歌搜索.NET中创建插件。

        8
  •  1
  •   Brisbe    16 年前

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

        9
  •  1
  •   reustmd    16 年前

    不能停止Visual Studio向web.config添加程序集。

        10
  •  1
  •   Beska    16 年前

    很抱歉,无法停止Visual Studio向web.config添加程序集。 但并非所有人都失去了。

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

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

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

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

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

        11
  •  1
  •   Christian Hayter    16 年前

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

    如果这对您来说不实用,请尝试将尽可能多的代码重新考虑到一个单独的类库项目中。任何可以从网站移到类库的引用都会减少 web.config 变化。

    编辑: 为了澄清,在一个网站中,aspnet编译器编译所有内容(标记、代码隐藏、批),因此所有程序集引用都必须 Web.CONFIG . 但是,在Web应用程序项目中,C或VB编译器将代码隐藏文件编译成单独的dll,然后由aspnet编译器在编译标记时引用该dll。在此方案中,程序集 仅在代码隐藏文件中引用 将进入DLL后面的代码,而不是触摸 web.config文件 完全。仅限于以下程序集 直接在标记中引用 将进入 Web.CONFIG .

        12
  •  0
  •   Mitch Wheat    16 年前

    我认为您不能阻止Visual Studio自动添加对其他程序集引用的程序集的引用。

    一种解决方案是创建一个具有自动化自定义操作的Web安装项目 将这些不需要的程序集引用从 web.config .

        13
  •  0
  •   Nick Berardi    16 年前

    这些都是项目所需的所有程序集,以某种形式或庄园形式存在,并且有助于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框架安装 目录 (%systemroot%\microsoft.net\framework\version)。

    这意味着您的/bin目录或.NET框架安装目录中的任何程序集都将被包括在内。

    这告诉我关于您的问题的是,正在包含的那些程序集已经以某种方式引用到您的项目中。他们可能来自 Avatar Dot Net Library 或者页面上的一些控件。 在虚拟人物库的Visual Studio项目中,检查“引用”文件夹中是否存在不需要的引用。因为这就是构建过程从中获取这些库的地方。

    所以换句话说,如果你不想把它们包括在内,就把你引用的项目从这些库的所有引用中清除掉。

    或者,您可以使用msbuild XML解析器在每次运行生成过程时删除web.config的该部分。我个人使用的任务是 XmlUpdate 修改web.config的某些部分以使其生产就绪。如果你想这样做,它是 MSBuild Community Tasks .

        14
  •  0
  •   tb.    16 年前

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

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

        15
  •  0
  •   manji    16 年前

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

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

        16
  •  -3
  •   tforster    16 年前

    我首先检查代码文件中的“使用”语句以及.aspx、.ascx文件中的任何引用。听起来您引用了其中一些内容(我知道默认情况下会从添加新项目模板中添加一些内容)。