【问题标题】:ASP.Net error: "The type 'foo' exists in both "temp1.dll" and "temp2.dll"ASP.Net 错误:“类型 'foo' 存在于“temp1.dll”和“temp2.​​dll”中
【发布时间】:2010-09-27 03:38:00
【问题描述】:

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

【问题讨论】:

    标签: asp.net


    【解决方案1】:

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

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

    http://www.sellsbrothers.com/1995

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

    【讨论】:

    • 伙计,谢谢。今天正争先恐后地在生产现场解决这个问题。还不知道是什么原因造成的(已经工作了这么久!),但这已经为我们解决了这个问题。
    • 谢谢。这行得通。今早醒来发现这个错误。我的 ISP discountasp.net 一定改变了一些东西。如果不是这篇文章,我仍然会遇到错误。为我的 ISP 点赞。
    • 有用的答案 - 语法在这里:
    • 注意这个警告:“这种方法只推荐用于小型应用程序......这会导致内存碎片。”
    【解决方案2】:

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

    要么将 App_Code 中的 .cs 文件的构建操作作为内容,要么将 App_Code 的名称更改为其他名称。我更改了名称,因为智能感知不会修复标记为内容的 .cs 文件。

    更多信息http://vishaljoshi.blogspot.se/2009/07/appcode-folder-doesnt-work-with-web.html

    【讨论】:

      【解决方案3】:

      此错误的一个可能原因是<@page language=......inherits=> 行中的inherits= 中有2 个aspx 页面具有相同的名称。

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

      【讨论】:

      • 这解决了我的问题,当您不需要代码隐藏做任何事情时,似乎复制/粘贴用户控件有点棘手。
      【解决方案4】:

      以防其他人分享我的问题,我在尝试发布新分支项目的网站时遇到此错误,构建工作完美。

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

      【讨论】:

        【解决方案5】:

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

        此解决方案位于我的 D:\svn 文件夹的子文件夹中,我已将其映射到 S:。当我从 S: 打开解决方案时,出现了这些错误,但如果我直接进入 D:\svn 并打开解决方案,则没有错误。

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

        奇怪。

        【讨论】:

          【解决方案6】:

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

          ASPX 页面:仪表板 类:partiacl类仪表板

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

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

          【讨论】:

            【解决方案7】:

            在我的例子中,我重命名了一个项目,因此 dll 也被重命名。当我刚刚复制了新的 dll 但没有想到从服务器中删除旧的 dll 时,我很快就有了一堆同名的类。删除过时的 dll 可以解决问题(原因)。

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

                在我的情况下,从解决方案中所有项目的 bin 文件夹中删除所有输出程序集解决了这个问题。不幸的是,我对此没有任何解释。

                【讨论】:

                  【解决方案10】:

                  在我的例子中,当我编辑一个仍然有重复类名的 Designer.cs 文件时,问题就解决了。出于某种原因,当我将类“logout”重命名为“logout2”时,在设计器文件中它没有自动更改,仍然是“logout”,并且这个类名已经存在于我项目的预编译 dll 中(属于到我使用和开发的第三方网络应用程序)。

                  【讨论】:

                  • 如果您想出一个新的方法来导致错误消息,请随时添加它:)
                  【解决方案11】:

                  将 aspx 页面的一部分放入单独的用户控件时遇到此问题。在我的机器上一切正常,在服务器上出现错误。

                  重命名问题类和文件。

                  http://support.microsoft.com/kb/919284 方法2:重新排序应用程序中的文件夹正在写关于可能的循环引用

                  【讨论】:

                    【解决方案12】:

                    这些解决方案都不适合我。我的两个冲突 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 获取更多线索。

                    【讨论】:

                      【解决方案13】:

                      我的问题与在我的项目文件夹中生成的 .dll 相关联。

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

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

                      我不建议对您的 web.config 文件进行修改,因为这只是一个创可贴的修复 - 并不能真正解决实际问题。如果您不想解决问题,请执行此操作,但如果您想避免以后的麻烦,只需从这两个位置删除 .dll。

                      【讨论】:

                        【解决方案14】:

                        我在两个不同的项目中有一个同名的部分类。 我只在一个项目中解决了它。

                        【讨论】:

                          【解决方案15】:

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

                          通常重建解决方案应该可以解决这些问题。

                          【讨论】:

                            【解决方案16】:

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

                            我的控制器有一个简单的静态代码,所以我改变了我的 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)
                                    {
                                    }
                                }
                            }
                            

                            这对我有用。

                            【讨论】:

                              【解决方案17】:

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

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

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

                              【讨论】:

                                【解决方案18】:

                                如果 DLL 显示在临时文件夹中,您应该尝试清理您的解决方案。

                                【讨论】:

                                  【解决方案19】:

                                  发布我的解决方案:

                                  该问题与 Mcafee Antivirus 的“按访问扫描”有关。禁用此功能可解决问题。不知何故,当防病毒打开时,ASP 临时文件夹没有被 ASP 正确使用。

                                  希望这对某人有所帮助。

                                  【讨论】:

                                  • 你知道为什么吗?我的团队也有这个问题,他们说这是因为 McAfee,但是,根据公司 IT 规则,我们无法停用防病毒软件(这不应该干扰!)。
                                  • 我们仍在努力寻找确切的原因。不幸的是,从按访问扫描中排除 ASP 临时文件夹并不能永久解决问题。
                                  【解决方案20】:

                                  App_Code 文件夹导致问题,将类放在文件夹外(工作正常)

                                  App_Code 文件夹不是为 Web 应用程序项目设计的

                                  http://vishaljoshi.blogspot.in/2009/07/appcode-folder-doesnt-work-with-web.html

                                  【讨论】:

                                    【解决方案21】:

                                    转到添加引用并搜索这两个 dll, 两个 dll 都会选中,取消选中其中一个 dll,因为会生成对具有不同版本歧义的相同 dll 的引用。

                                    【讨论】:

                                      【解决方案22】:

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

                                      【讨论】:

                                        【解决方案23】:

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

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

                                        【讨论】:

                                          【解决方案24】:

                                          我在编译时遇到了问题。

                                          同意 batch="true" 属性,错误提示存在 2 个程序集

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

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

                                          【讨论】:

                                            猜你喜欢
                                            • 2011-02-05
                                            • 1970-01-01
                                            • 2017-01-13
                                            • 2012-05-16
                                            • 2012-07-30
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 2021-01-29
                                            • 1970-01-01
                                            相关资源
                                            最近更新 更多