ASP.Net错误:“ temp1.dll”和“ temp2.​​dll”中都存在类型“ foo”


108

当运行Web应用程序项目时,在表面随机的时间,页面可能会失败并出现CS0433错误:类型存在于多个DLL中。这些DLL都是驻留在“ Temporary ASP.NET Files”目录中的所有生成的DLL。

Answers:


135

将batch =“ false”属性添加到web.config文件的“ compilation”元素。

发生此问题的原因是ASP.NET 2.0使用应用程序引用和应用程序的文件夹结构来编译应用程序的方式。如果该应用程序的web.config文件中的元素的batch属性设置为true,则ASP.NET 2.0会将应用程序中的每个文件夹编译到一个单独的程序集中。

http://www.sellsbrothers.com/1995

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


伙计,为此。今天正忙于在生产站点中修复此问题。不知道是什么原因引起的(已经工作了这么长时间了!),但这已经为我们解决了这个问题。
马特2010年

谢谢。这可行。今天早上醒来时出现此错误。我的ISP Discountasp.net必须有所更改。如果不是这篇文章,我仍然会有错误。拒绝我的ISP。
戴蒙2012年

3
有用的答案-语法在这里:<compilation ... batch =“ false” />
Catto 2012年

1
请注意以下警告:“仅建议将此方法用于小型应用程序。这会导致内存碎片。”
马修


11

一个可能的原因这个错误是,有哪些是在他们的同名2个aspx页面inherits=<@page language=......inherits=>线。

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


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

8

以防万一其他人也遇到我的问题,当我尝试发布一个新分支项目的网站时,我得到了这个错误,构建工作正常。

原来我忘记了在发布设置”->“配置预编译下删除“允许预编译站点可更新”复选框。


4

作为另一个数据点,我遇到了这个问题,但没有任何证据表明Ben的答案中的链接中有循环引用。建立我的网站项目会因一些错误而失败,然后进行设置compilation batch="false"修复,但是我不想走这条路,因为这是一个大型的生产网站。

该解决方案位于我的D:\ svn文件夹的子文件夹中,该文件夹已映射到S:。当我从S:打开解决方案时,会发生这些错误,但是如果我直接转到D:\ svn并打开解决方案,则不会出错。

我还注意到,尽管compilation batch="true"在我的web.config中,但从映射的S:驱动器打开解决方案时,我所有的.ascx文件都被编译成它们自己的程序集。如果我从物理位置打开它,则.ascx文件将被编译到各自文件夹的程序集中(这batch="true"应该是这样工作的)。

奇怪。


4

此错误是由于Web表单的类名和具有相同类名的wsdl stub(文件.cs后面的代码)之间的冲突引起的,即

ASPX页面:仪表板类:partiacl类

AppCode / APIServices.cs:公共部分类仪表板

错误仅在发布网站时才可重现,但构建和调试未通知任何错误。


2

就我而言,我已重命名了一个项目,因此dll也已重命名。当我只是复制新的dll但不打算从服务器删除旧的dll时,我很快就得到了一堆成对的同名类。删除过时的dll可以解决问题(原因)。


2

这些答案都不适合我,但是我确实解决了问题。由于我使用VS的发布功能来部署Web应用程序,因此我选择了在发布之前删除所有现有文件的选项在发布Web向导中进行发布。这强制了应用程序的干净副本,并且一切正常。

如果您的本地调试副本运行良好,但发布的系统运行不正常,则此解决方案可能会有所帮助。如果您不想花时间跟踪要删除的单个dll,并且不介意首先删除生产文件,那也很好。


2

就我而言,从解决方案中所有项目的bin文件夹中删除所有输出程序集解决了该问题。不幸的是,我对此没有任何解释。


1

就我而言,当我编辑仍然具有重复的类名的Designer.cs文件时,该问题已解决。由于某种原因,当我将类“ logout”重命名为“ logout2”时,在设计器文件中它没有自动更改,仍然是“ logout”,并且该类名称已经存在于我的项目中的预编译dll中(该类属于与我合作并开发的第三方网络应用)。


如果您想出一种新的方式来导致错误消息,请随时添加:)
Ben Fulton 2012年


1

这些解决方案都不适合我。我两个冲突的DLL都在C:\ ... \ AppData \ ... \临时ASP.NET文件\ ...中

问题是我在同一解决方案中将类型从一个项目移动到另一个项目之前,已将源存储库回滚到了较早的版本。

我尝试从msbuild标识的“ Temporary ASP.NET Files”位置删除较新的DLL(在旧的代码库中甚至根本没有该DLL)。msbuild只是放回去。

我还尝试了其中一些已成功使用的web.config设置,但这也不起作用。尽管在撰写本文时,我意识到在同一解决方案中实际上有两个MVC项目,并且两个项目都有错误,所以问题可能出在我没有将设置添加到这两个项目中。

我尝试将源回购向前滚动并进行清理,然后再次回滚并进行清理。没有。

我尝试删除所有“ ASP.NET临时文件”位置。msbuild将其放回原处。

最后,我尝试在Visual Studio中进行重建。尽管命令行输出和“错误”输出都给出了相同的msbuild“临时ASP.NET文件”错误,但是Intellisense错误(将鼠标悬停在冲突的类型上时)实际上抱怨输出目录中的DLL。显然“清洁”和“重建”没有完成他们的工作。我手动删除了Intellisense标识的输出目录中的DLL,问题已解决。

tl; dr-确保使用批处理设置覆盖了所有web.configs,并尝试利用Intellisense获得更多线索。


1

我的问题与在项目文件夹中生成的.dll链接。

如果您要引用另一个文件,而不是执行上面的所有操作,立即解决我的问题的是,只是删除保留在我项目的/ bin目录中的.dll。

该问题不一定是web.config修复程序-它是需要解决的循环引用。我意识到我清除了原始项目文件中的旧.dll,但未清除引用它的项目中的。

我不建议对您的web.config文件进行修改,因为这只是一个临时解决方案-并未真正解决实际问题。如果您不想解决问题,请执行此操作,但是如果您想避免将来遇到麻烦,只需从两个位置删除.dll。


1

在两个不同的项目中,我有一个同名的局部类。我只将其留在一个项目中即可解决。


0

有时,它可能有助于删除解决方案并重新创建。由于从VS2005转换到vs2010时会发生这种用法,因此解决方案中仍然保留了对框架4.0的一些引用(升级后),甚至所有项目都定义为3.5。

通常,重新构建解决方案应清除这些问题。


0

在编译服务器上编译应用程序时,我遇到了同样的问题。

我的控制器有一个简单的静态代码,因此我更改了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" %>

还从代码隐藏中删除了partial关键字,并在代码隐藏中添加了名称空间。

这个:

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)
        {
        }
    }
}

那对我有用。


0

对我来说,当我将PrecompiledWeb / Publish位置设置为当前目录时,这也是该站点的根文件夹所在的位置。

然后,我的网站在编译/构建时将publish文件夹视为项目的一部分,然后以这种方式查找重复项。

即,不要将网站的发布/预编译版本放在网站的代码文件夹中。



0

发布我的解决方案:

该问题与Mcafee Antivirus的“按访问扫描”有关。禁用此功能可以解决问题。启用防病毒功能后,ASP无法正确使用ASP Temporary文件夹。

希望这对某人有帮助。


你知道为什么吗 我的团队也遇到了这个问题,他们说这是由于McAfee引起的,但是,根据公司的IT规则,我们无法停用防病毒软件(不应干涉!)。
Kat Lim Ruiz 2015年

我们仍在努力寻找确切原因。不幸的是,从“按访问扫描”中排除“ ASP临时”文件夹并不能永久解决该问题。
阿德里安·纳苏


0

转到“添加引用”并搜索两个dll,因为将生成具有不同版本歧义的同一个dll的引用,所以两个dll都将被选中,取消选中其中一个dll。


0

我的解决方案是将.aspx文件中的CodePage =“ ....”替换为CodeBehind =“ ...”。从以前的.NET版本迁移期间,以某种方式将其保留为CodePage。此页面伪指令创建另一个与项目dll文件冲突的dll文件。


0

这些解决方案都不适合我。在“发布”模式下进行编译是可行的,但是当我切换到“调试”时,我收到了很多此错误消息。

我不明白为什么,但是我的解决方案是简单重启Visual Studio


0

我在编译时遇到了这个问题。

同意批次=“真”的属性,错误是告诉组件存在2

解决方案1: 删除其中之一

解决方案2:配置其中之一

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.