【发布时间】:2010-09-27 03:38:00
【问题描述】:
在运行 Web 应用程序项目时,页面可能会在看似随机的时间失败并出现 CS0433 错误:类型存在于多个 DLL 中。 DLL 都是生成的 DLL,驻留在“Temporary ASP.NET Files”目录中。
【问题讨论】:
标签: asp.net
在运行 Web 应用程序项目时,页面可能会在看似随机的时间失败并出现 CS0433 错误:类型存在于多个 DLL 中。 DLL 都是生成的 DLL,驻留在“Temporary ASP.NET Files”目录中。
【问题讨论】:
标签: asp.net
将 batch="false" 属性添加到 web.config 文件的“编译”元素中。
出现此问题的原因是 ASP.NET 2.0 使用应用程序引用和应用程序文件夹结构来编译应用程序的方式。如果应用程序的 web.config 文件中元素的批处理属性设置为 true,则 ASP.NET 2.0 会将应用程序中的每个文件夹编译成一个单独的程序集。
【讨论】:
如果您将 .cs 文件放在 App_Code 中并将其构建操作更改为在 Web 应用程序项目中编译,则可能会发生这种情况。
要么将 App_Code 中的 .cs 文件的构建操作作为内容,要么将 App_Code 的名称更改为其他名称。我更改了名称,因为智能感知不会修复标记为内容的 .cs 文件。
更多信息http://vishaljoshi.blogspot.se/2009/07/appcode-folder-doesnt-work-with-web.html
【讨论】:
此错误的一个可能原因是<@page language=......inherits=> 行中的inherits= 中有2 个aspx 页面具有相同的名称。
更改inherits= 名称可解决错误。
【讨论】:
以防其他人分享我的问题,我在尝试发布新分支项目的网站时遇到此错误,构建工作完美。
原来我忘记删除发布设置 -> 配置预编译下的“允许预编译站点可更新”复选框。
【讨论】:
作为另一个数据点,我只是遇到了这个问题没有任何循环引用的证据,如 Ben 的答案中的链接中所述。构建我的网站项目会因其中一些错误而失败,并设置 compilation batch="false" 修复它,但我不想走这条路,因为这是一个大型生产网站。
此解决方案位于我的 D:\svn 文件夹的子文件夹中,我已将其映射到 S:。当我从 S: 打开解决方案时,出现了这些错误,但如果我直接进入 D:\svn 并打开解决方案,则没有错误。
我还注意到,尽管我的 web.config 中有 compilation batch="true",但当从映射的 S: 驱动器打开解决方案时,我的所有 .ascx 文件都会编译到它们自己的程序集中。如果我从物理位置打开它,.ascx 文件会被编译到它们各自文件夹的程序集中(batch="true" 应该是这样工作的)。
奇怪。
【讨论】:
此错误是由于 Web 表单的类名与具有相同类名的 wsdl 存根(文件 .cs 后面的代码)之间的冲突,即
ASPX 页面:仪表板 类:partiacl类仪表板
AppCode/APIServices.cs:公共部分类仪表板
错误仅在发布网站时可重现,但构建和调试未通知任何错误。
【讨论】:
在我的例子中,我重命名了一个项目,因此 dll 也被重命名。当我刚刚复制了新的 dll 但没有想到从服务器中删除旧的 dll 时,我很快就有了一堆同名的类。删除过时的 dll 可以解决问题(原因)。
【讨论】:
这些答案都不适合我,但我确实解决了这个问题。由于我使用 VS 的 Publish 功能来部署 Web 应用程序,因此我在 Publish Web 向导中选择了在发布之前删除所有现有文件的选项。这迫使应用程序的一个干净的副本,从那里一切正常。
如果您的本地调试副本工作正常但发布的系统不能正常工作,此解决方案可能会有所帮助。如果您不想花时间追踪要删除的单个 dll 并且不介意先删除生产文件,那也很好。
【讨论】:
在我的情况下,从解决方案中所有项目的 bin 文件夹中删除所有输出程序集解决了这个问题。不幸的是,我对此没有任何解释。
【讨论】:
在我的例子中,当我编辑一个仍然有重复类名的 Designer.cs 文件时,问题就解决了。出于某种原因,当我将类“logout”重命名为“logout2”时,在设计器文件中它没有自动更改,仍然是“logout”,并且这个类名已经存在于我项目的预编译 dll 中(属于到我使用和开发的第三方网络应用程序)。
【讨论】:
将 aspx 页面的一部分放入单独的用户控件时遇到此问题。在我的机器上一切正常,在服务器上出现错误。
重命名问题类和文件。
http://support.microsoft.com/kb/919284 方法2:重新排序应用程序中的文件夹正在写关于可能的循环引用
【讨论】:
这些解决方案都不适合我。我的两个冲突 DLL 都在 C:\...\AppData\...\Temporary ASP.NET Files\...
问题是我已将源代码库回滚到早期版本 - 在我们将类型从一个项目移动到同一解决方案中的另一个项目之前。
我尝试从 msbuild 标识的“临时 ASP.NET 文件”位置删除较新的 DLL——它甚至根本不应该存在于旧代码库中。 msbuild 只是把它放回去。
我也试过这里有些人已经成功使用的 web.config 设置,但也没有用。虽然在我写这篇文章时,我意识到实际上在同一个解决方案中有两个 MVC 项目并且都有错误,所以问题可能是我没有为这两个项目添加设置。
我尝试将我的源代码库向前滚动并清理,然后再次回滚并清理。什么都没有。
我尝试删除“临时 ASP.NET 文件”位置的所有内容。 msbuild 只是把它重新放回去。
最后,我尝试在 Visual Studio 中重建。尽管命令行输出和“错误”输出都给出了相同的 msbuild“临时 ASP.NET 文件”错误,但 Intellisense 错误(将鼠标悬停在冲突类型上时)实际上抱怨输出目录中的 DLL。显然“清洁”和“重建”并没有做好他们的工作。我手动删除了Intellisense识别的输出目录中的DLL,问题解决了。
tl;dr - 确保使用批处理设置覆盖所有 web.config,并尝试利用 Intellisense 获取更多线索。
【讨论】:
我的问题与在我的项目文件夹中生成的 .dll 相关联。
如果您正在引用另一个文件,而不是执行您在上面看到的所有操作,立即解决我的问题的方法是删除保留在我的项目 /bin 目录中的 .dll。
问题不一定是 web.config 修复 - 它是需要解决的循环引用。我意识到我清除了原始项目文件中的旧 .dll,但没有在引用它的项目中清除。
我不建议对您的 web.config 文件进行修改,因为这只是一个创可贴的修复 - 并不能真正解决实际问题。如果您不想解决问题,请执行此操作,但如果您想避免以后的麻烦,只需从这两个位置删除 .dll。
【讨论】:
我在两个不同的项目中有一个同名的部分类。 我只在一个项目中解决了它。
【讨论】:
有时删除解决方案并重新创建它可能会有所帮助。 由于从 VS2005 转换到 vs2010 时会发生这种使用,因此解决方案中保留了一些对框架 4.0(升级后)的引用,甚至所有项目都定义为 3.5。
通常重建解决方案应该可以解决这些问题。
【讨论】:
我在编译服务器上编译应用程序时遇到了同样的问题。
我的控制器有一个简单的静态代码,所以我改变了我的 ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="controllerName.ascx.cs" Inherits="Controls.controllerName" %>
到
<%@ Control Language="C#" AutoEventWireup="true" Src="controllerName.ascx.cs" Inherits="Controls.controllerName" %>
还从代码隐藏中删除了部分关键字,并向代码隐藏添加了一个命名空间。
这个:
using System;
using System.Web.UI;
/// <summary>
/// My controller
/// </summary>
public partial class controllerName: UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
到这里:
using System;
using System.Web.UI;
namespace Controles
{
/// <summary>
/// My controller
/// </summary>
public class controllerName : UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
}
这对我有用。
【讨论】:
对我来说,这发生在我将 PrecompiledWeb/Publish 位置设置为当前目录时,该目录也是该站点的根文件夹所在的位置。
我的网站在编译/构建时将发布文件夹视为项目的一部分,然后以这种方式查找重复项。
即不要将您网站的已发布/预编译版本放在您网站的代码文件夹中。
【讨论】:
如果 DLL 显示在临时文件夹中,您应该尝试清理您的解决方案。
【讨论】:
发布我的解决方案:
该问题与 Mcafee Antivirus 的“按访问扫描”有关。禁用此功能可解决问题。不知何故,当防病毒打开时,ASP 临时文件夹没有被 ASP 正确使用。
希望这对某人有所帮助。
【讨论】:
App_Code 文件夹导致问题,将类放在文件夹外(工作正常)
App_Code 文件夹不是为 Web 应用程序项目设计的
http://vishaljoshi.blogspot.in/2009/07/appcode-folder-doesnt-work-with-web.html
【讨论】:
转到添加引用并搜索这两个 dll, 两个 dll 都会选中,取消选中其中一个 dll,因为会生成对具有不同版本歧义的相同 dll 的引用。
【讨论】:
我的解决方案是将 .aspx 文件中的 CodePage="...." 替换为 CodeBehind="..."。在从以前的 .NET 版本迁移期间,它以某种方式保留为 CodePage。 此页面指令创建另一个与项目 dll 文件冲突的 dll 文件。
【讨论】:
这些解决方案都不适合我。在“发布”模式下编译是可行的,但是当我切换到“调试”时,我收到了无数这样的错误消息。
我不明白为什么,但我的解决方案是重新启动 Visual Studio。
【讨论】:
我在编译时遇到了问题。
我同意 batch="true" 属性,错误提示存在 2 个程序集
解决方案 1:删除其中一个
解决方案2:配置其中一个
【讨论】: