ASP.Net错误:“类型'foo'同时存在于“temp1.dll”和“temp2.dll”中”

110
在运行Web应用程序项目时,可能会在看似随机的时间内失败并显示CS0433错误:类型存在于多个DLL中。这些DLL都是位于“Temporary ASP.NET Files”目录中的生成的DLL。
26个回答

136
在 web.config 文件的 "compilation" 元素中添加 batch="false" 属性。
这个问题是由 ASP.NET 2.0 使用应用程序引用和应用程序的文件夹结构来编译应用程序的方式导致的。如果应用程序的 web.config 文件中的 元素的 batch 属性设置为 true,则 ASP.NET 2.0 将应用程序中的每个文件夹编译成一个单独的程序集。

http://www.sellsbrothers.com/1995

http://support.microsoft.com/kb/919284


哥们,谢谢你。今天我在生产网站上忙着修复这个问题。虽然不知道是什么原因导致的(之前一直都好好的!),但这个解决方案已经帮我们解决了问题。 - Matt
谢谢。这个有效。今天早上醒来时出现了这个错误。我的ISP discountasp.net一定改变了什么。如果不是因为这篇文章,我还会有这个错误。对于我的ISP,我给个差评。 - Damon
3
有用的回答 - 语法如下:<compilation ... batch="false"/>。(注:该语法是ASP.NET应用程序的一部分,用于指定编译器选项。其中的batch="false"表示禁用批处理模式。) - Catto
1
请注意:这个警告:“此方法仅建议用于小型应用程序... 这会导致内存碎片化。” - ThatMatthew

22

如果您将 .cs 文件放在 App_Code 中,并将它们的建立操作更改为 Web 应用程序项目中的编译,则可能会发生这种情况。

可以将 App_Code 中的 .cs 文件的建立操作设置为 Content,或者更改 App_Code 的名称。我更改了名称,因为智能感知无法修复标记为内容的 .cs 文件。

有关更多信息,请访问http://vishaljoshi.blogspot.se/2009/07/appcode-folder-doesnt-work-with-web.html


11

出现这个错误的一个可能原因是,有两个aspx页面在它们的<@page language=......inherits=>行中具有相同的inherits=名称。

更改inherits=名称可以解决该错误。


2
这解决了我的问题,似乎当您不需要代码后台执行任何操作时,复制/粘贴用户控件有点棘手。 - Grubsnik

8

如果有其他人也遇到了这个问题,在尝试发布一个新分支项目的Web网站时,构建工作正常,但是出现了以下错误:

结果发现我忘记在发布设置 -> 预编译配置下取消"允许预编译网站可更新"的复选框。


4

该错误是由于Web表单的类名与WSDL存根(后端.cs文件)具有相同的类名造成的,即

ASPX页面:仪表板 类:部分类仪表板

AppCode / APIServices.cs:public partial class Dashboard

只有在发布网站时才能重现错误,但构建和调试并未提示任何错误。


4
作为另一个数据点,我刚刚遇到了这个问题,没有像Ben的答案中描述的循环引用的任何证据。构建我的网站项目会失败,并显示一些错误,将compilation batch="false"设置后问题得到解决,但我不想采取这种方法,因为这是一个相对较大的生产网站。
这个解决方案位于我的D:\svn文件夹的子文件夹中,我已将其映射到S:。当我从S:打开解决方案时,就会出现这些错误,但如果我直接打开D:\svn并打开解决方案,则不会出错。
我还注意到,尽管在我的web.config中设置了compilation batch="true",但在从映射的S:驱动器打开解决方案时,所有我的.ascx文件都被编译成它们自己的程序集。如果我从物理位置打开它,则.ascx文件将被编译到各自文件夹的程序集中(这是batch="true"应该工作的方式)。
奇怪。

3
在我的情况下,删除解决方案中所有项目的bin文件夹中的所有输出程序集解决了这个问题。不幸的是,我无法解释原因。

2
没有这些答案对我有用,但是我已经解决了问题。由于我使用VS的发布功能部署Web应用程序,我在发布Web向导中选择了“在发布之前删除所有现有文件”的选项。这强制执行了应用程序的清理副本,从那时起一切正常。
如果您的本地调试副本运行良好但已发布系统不行,则此解决方案可能有用。如果您不想花时间跟踪要删除的每个dll并且不介意删除生产文件,则也很棒。

2

在我的情况下,我重命名了项目,所以dll也被重命名。当我只是复制新的dll,但没有考虑从服务器删除旧的dll时,很快就会有许多具有相同名称的类对。删除过时的dll可以解决问题(当然要注意)。


1
在我的情况下,当我编辑一个 Designer.cs 文件时,问题得到了解决,该文件仍然具有重复的类名。由于某种原因,当我将类名“logout”更改为“logout2”时,在设计师文件中它并没有自动更改,并且仍然是“logout”,而这个类名已经存在于我项目中的预编译 dll 中(属于我使用和开发周围第三方 Web 应用程序)。

如果你想出了一种新的导致错误信息的方式,随时可以添加 :) - Ben Fulton

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