如何阻止Visual Studio向我的web.config添加程序集?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何阻止Visual Studio向我的web.config添加程序集?相关的知识,希望对你有一定的参考价值。
每次构建或发布网站时,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无法向其添加程序集。
更新
截图作为证据:
项目属性页面之前:
Web.Config之前:
项目属性页面后:
Web.config之后:
更新二
应明确指出,网站的工作没有添加这些无关的引用。我的临时解决方案是将web.config保持为只读,并在Visual Studio在尝试修改它时抱怨它是只读时点击取消。如果我可以阻止Visual Studio首先尝试修改它...
更新三
看起来这是不可能的。有人可以随意给出正确的答案,“你无法阻止Visual Studio向你的web.config添加程序集。”我会标记它。
我保持这个问题的唯一原因是,希望有人知道超级秘密选项,或注册表项,或项目或解决方案设置,告诉Visual Studio停止思考。
更新四
我不接受接受的答案,如果可以的话,我会接受它。我仍然希望有灵丹妙药。但是现在我倾向于:
- 答:不能做(manu08)
- 解决方法:过滤的GAC程序集注册表项(Nebakanezer)
如何阻止Visual Studio将程序集添加到我的web.config中?
参考
- ASP Net - Visual Studio keeps adding Oracle assemblies to web.config
- Why are the Visual Studio Add-In Assemblies being added to my web.config?
- Visual Studio Adds Assembly Reference To web.config
- removing VsWebSite.Interop Assembly from Web.Config
- Visual Studio 2005 automatically adding references to web.config on build
我使用VS2005编辑.net 1.1(VS2003).aspx并保存它,然后web.config将神秘地拥有网络。添加了2.0个组件:
如果我使用VS2008或VS2010,则不会发生这种情况。所以我相信这是VS2005 IDE中的一个错误。
抱歉,您无法阻止Visual Studio向您的web.config添加程序集,但所有程序都不会丢失。
我过去打过这个;有人在低级数据访问程序集中添加了一些引用(包括WinForms)。该网站使用了低级数据访问程序集,因此在Web.config文件中添加了WinForms等。
解决方案是将他的代码移动到正确的程序集中并删除不正确的引用。
如果您无法对具有不需要的引用的程序集进行排序,并且您知道您没有调用依赖于不需要的引用的代码。那么你可以(这些都不好)
- 编写自定义安装操作,自动从web.config中删除这些不需要的程序集引用
- 编写自定义MSBUILD操作以在构建时删除
- 安装应用程序时,请使用另一个手写的web.config文件。
可能需要很长时间才能找到Visual Studio添加对web.config文件的引用的原因。您必须手动检查由网站直接或间接使用的每个程序集。
我知道并理解为什么微软在ASP.NET 2.0中发明了网站,但有时它们只是简单的吮吸。如果它对您来说很实用,请将您的站点转换为Web应用程序项目,这样的问题就会消失。
如果这对您不切实际,请尝试将尽可能多的代码重新分配到单独的类库项目中。您可以移出网站并进入类库的任何引用都将减少web.config
的更改。
编辑:为了澄清,在网站上,aspnet编译器编译所有内容(标记,代码隐藏,批次),因此所有程序集引用必须进入web.config
。但是,在Web应用程序项目中,C#或VB编译器将代码隐藏文件编译为单独的DLL,然后在编译标记时由aspnet编译器引用。在这种情况下,仅在代码隐藏文件中引用的程序集将进入代码隐藏DLL而不会触及web.config
。只有在标记中直接引用的程序集才会进入web.config
。
我不相信您可以阻止Visual Studio自动添加对其他人引用的程序集的引用。
一种解决方案是使用自定义操作创建Web安装项目,该操作可自动从web.config
中删除这些不需要的程序集引用。
这些是您的项目所需的所有程序集,在某种形状或庄园中,以及ASP.NET在运行时对您的页面执行的编译。它们可能是由您在项目中使用的代码或使用它们的其他库导入的。
但根据documentation。这些是在全局web.config中定义的程序集,可以在C:WindowsMicrosoft.NETFrameworkv2.0.50727CONFIG
中找到:
<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的一部分。
如果您在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/
见http://msdn.microsoft.com/en-us/library/ms178728.aspx
在那里解释了你在属性页中看到的并不是全部,在Machine.config文件中也存在隐式引用,并在编译时添加。希望这可以帮助。
我首先检查代码文件中的“using”语句以及.aspx,.ascx文件中的任何引用。听起来你已经引用了其中的一些(我知道默认情况下会从Add New Item模板中添加一些。
也许“阿凡达DotNet库”本身就是引用这些组件。需要引用程序集的引用才能正确部署项目。否则,引用的程序集如何工作?
请注意,引用的程序集可能不使用自己的引用,尽管它们存在。
编辑:您可以使用伟大的工具“.Net Reflector”来检查这一点。
我在Visual Studio 2005中遇到了这个问题(但我很高兴地报告该解决方案适用于VS 2008,请参阅下面的粗体文字)。在将程序集添加到web.config文件之前,VS会检查一个注册表部分。
这是关键:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftVisualStudio8.0Projects{E24C65DC-7377-472B-9ABA-BC803B73C61A}FilteredGACReferences
因此,假设您不希望Visual Studio将Microsoft.VisualStudio.Designer.Interfaces程序集添加到您的web.config中。将以下条目添加到注册表中即可进行设置。
HKEY_LOCAL_MACHINESOFTWAREMicrosoftVisualStudio8.0Projects{E24C65DC-7377-472B-9ABA-BC803B73C61A}FilteredGACReferencesMicrosoft.VisualStudio.Designer.Interfaces
它对我来说很完美。是的,你团队的其他成员也必须这样做,但至少你不必每次都手动删除条目:)
要使其适用于VS 2008 - 只需将注册表路径中的8.0更改为9.0
将“Web站点”项目转换为“Web应用程序”项目。
“Web站点”没有项目文件,因此它包含web.config中的所有程序集引用。 “Web项目”具有项目文件,所有引用都存储在项目文件中。
删除参考。
- 如果是Web应用程序:您可以在Solution Explorer下看到References。
- 如果是网站:右键单击解决方案资源管理器上的项目,然后选择属性页。在那里管理它们。
HTH
如果共享程序集引用它们,那么它们也将被添加到调用项目中。
由于Avatar库提供了这些其他引用,因此Visual Studio也会将这些引用添加到主项目中。否则,对Avatar库的调用可能会失败,因为缺少所需的引用。
好吧这看起来像是一个黑客,但考虑到你的要求,另一个选择是在运行时使用Assembly.Load或LoadFrom动态加载头像组件。这将保留主项目的引用,然后应该阻止web.config中的额外引用行。如果您只使用Avatar项目中的少量类,这只会非常实用。我将制作第三个项目,两个项目都引用了一个或多个Avatar类实现的接口,以便主项目在处理Avatar实例时保持严格的输入。我承认这可能是以前提交答案的更多工作。如果您对此方法感兴趣,请搜索谷歌在.Net中创建插件
只要您使用的是网站,而不是webapp,我就不知道有什么方法可以阻止Visual Studio向您的web.config添加程序集。我公司的解决方案也存在同样的问题。
您无法阻止Visual Studio向web.config添加程序集。
以上是关于如何阻止Visual Studio向我的web.config添加程序集?的主要内容,如果未能解决你的问题,请参考以下文章
如何防止 Visual Studio 2010 在 C++ 中向我的项目添加大型 SQL 文件?
如何阻止 Visual Studio 在我的代码中插入不可编辑的空白行
如果构建成功,如何让 Visual Studio 向我发出哔哔声?