ASP.Net错误:“temp1.dll”和“temp2.​​dll”中存在类型'foo'(第2页)

时间:2010-04-07 21:36:34

标签: asp.net .net .net-3.5 exception-handling

解决方案:

我也同时移动了ashx和asmx文件。 WebService / WebHandler指令的Class属性指向错误的命名空间。故事的寓意是确保您通过右键单击并选择“查看标记”来查看更改命名空间的所有 as*x文件的标记。


我遇到了与this questionthis link相同的问题,但没有一个答案解决了我的问题。 (编辑:设置web.config批处理属性有效,但这是一个掩盖,而不是解决方案)

我遇到的问题是用户控件,我从根目录移动到同一Web应用程序项目中的子目录。在移动它之前,它曾经很好地工作。当我移动它时,它开始给我错误信息。

它说类名存在于临时ASP.NET文件中的两个dll文件中。果然,当我打开Reflector时,它就在两个dll中。

如果我重命名该类和ascx文件,一切正常。在我的整个应用程序的任何文件中都不存在原始名称的用法。当我重命名文件时,我打开了带有Reflector的Temporary ASP.NET Files中的所有dll文件,并且不存在对原始类名的引用。

那么这个幽灵参考来自于我如何解决这个问题呢?

更新:我实际上在工作目录中为解决方案和我的临时目录中的每个文件添加了旧类名,并删除了包含它的每个文件。然后我重命名回原来的,破碎的名字,我仍然得到错误。

  '/'应用程序中的服务器错误。   编译错误说明:An   编译期间发生错误   为此提供服务所需的资源   请求。请查看以下内容   具体的错误细节和修改你的   适当的源代码。

     

编译器错误消息:CS0433:类型   'ASP.dashboard_badusercontrol_ascx'   存在于'c:\ Docunts和   设置\我\本地   Settings \ Temp \ Temporary ASP.NET   文件\ ROOT \ 3c2b7e1f \ 2e8a7620 \ App_Web_badusercontrol.ascx.a57ad085.iljdmp1p.dll”   和'c:\ Docunts and Settings \ me \ Local   Settings \ Temp \ Temporary ASP.NET   文件\根\ 3c2b7e1f \ 2e8a7620 \ App_Web_bhdqaimy.dll'

     

来源错误:

     

1098行:1099行:
  [System.Diagnostics.DebuggerNonUserCodeAttribute()]   1100行:私人   全球:: ASP.dashboard_badusercontrol_ascx   @__ BuildControlMyBadUserControl(){   1101行:
  全球:: ASP.dashboard_badusercontrol_ascx   @__ctrl;第1102行:

     

源文件:c:\ Docunts和   设置\我\本地   Settings \ Temp \ Temporary ASP.NET   文件\ ROOT \ 3c2b7e1f \ 2e8a7620 \ App_Web_foo.aspx.a57ad085.1nw6dais.0.cs   行:1100


编辑: 好的,所以我做了一些关于哪些有效和无效的测试。 假设名称空间“MyNamespace”中的原始文件名是“BadUserControl.ascx”。

我将文件移动到名为“NewDirectory”的目录,并将名称空间更改为“MyNamespace.NewDirectory”。我的硬盘上没有“BadUserControl.ascx”的副本。我仔细检查了我的TFS历史记录,以确保唯一的区别是在标记和代码隐藏文件中添加“.NewDirectory”到命名空间。

此命名空间内有另外两个名为“OtherUserControl”和“AnotherUserControl”的用户控件。

这种情况失败了: 我有2个Register指令:

<%@ Register src="BadUserControl.ascx" tagname="BadUserControl" tagprefix="uc1" %> 
<%@ Register src="OtherUserControl.ascx" tagname="OtherUserControl" tagprefix="uc2" %>

这些情况有效:

  1. 我保持名为“BadUserControl.ascx”的名字。 我在同一名称空间的页面上有1个Register指令:

    <%@ Register src="BadUserControl.ascx" tagname="BadUserControl" tagprefix="uc1" %>
    
  2. 我将“BadUserControl.ascx”更改为“GoodUserControl.ascx” 我有2个Register指令:

    <%@ Register src="GoodUserControl.ascx" tagname="GoodUserControl" tagprefix="uc1" %>
    <%@ Register src="OtherUserControl.ascx" tagname="OtherUserControl" tagprefix="uc2" %>
    
  3. 2注册没有BadUserControl.ascx的指令:

    <%@ Register src="AnotherUserControl.ascx" tagname="AnotherUserControl" tagprefix="uc1" %>
    <%@ Register src="OtherUserControl.ascx" tagname="OtherUserControl" tagprefix="uc2" %>
    

12 个答案:

答案 0 :(得分:15)

更新:好的,正如您所发现的那样,循环引用是错误的猜测,因为还有其他情况可能会导致类似的行为。

描述问题的更一般方法是在运行时批处理以非常宽松的方式工作,这可以掩盖问题。基本上,我们尝试在一个文件夹中批量处理所有内容,但如果在编译该批处理时遇到编译错误,我们将回退到单个文件编译。在许多情况下工作正常,但有时,这可能会导致给定页面编译两次(类似于我在下面描述的,但出于不同的原因)。

另一方面,aspnet_compiler以严格方式工作,如果批处理失败则完全失败并且不会退回。这就是为什么运行这个工具是找到各种类型的问题(或潜在问题)的好方法,这些问题在运行时很明显。我想我们没有做好为这个目的传福音这个工具:)

至于为什么重命名文件修复它,这可能是由于它改变了处理文件的顺序,这有点随意。如果你将它重命名为其他东西,你可能会再次发现它。

坦率地说,回顾我有点希望我们在运行时严格控制这种批处理行为,以便更早地捕获这些情况。我们选择目前的后备设计的原因是为了尽可能避免失败,但这需要付出代价:当出现问题时,抓住它会很痛苦:)


原始答案: 简而言之,问题是当打开批处理(默认情况下是这样)时,应避免使用目录级循环依赖关系。让我解释一下我的意思。

这是一个例子。说你有:

  • 在folder1:page.aspx和uc2.ascx
  • 在forder2:uc1.ascx

并说page.aspx引用uc1.ascx(通过@register指令),并且uc1.ascx引用uc2.ascx。在文件级别,这很好,但在目录级别,有一个循环依赖:folder1引用folder2中的东西,它引用folder1中的东西。

为什么这有问题与批处理的工作原理有关:当你请求页面时,它首先尝试一起编译folder1中的所有内容。但是由于folder1 / page.aspx引用了folder2 / uc1.ascx,它需要先编译folder2才能进行folder1。但是然后uc1使用uc2,这意味着它必须首先执行folder1!此时,ASP.NET检测到这种情况并尝试通过自身编译uc2.asc来充分利用它。虽然这允许一些场景工作,但它也可能导致奇怪的事情,因为一些项目最终编译在两个程序集中。在这里,uc2.ascx将自己编译并与folder1批处理。

实际上有一种方法可以轻松检测您的网站是否具有此类文件夹级循环依赖项。在VS控制台窗口中,转到站点的根目录并运行:

aspnet_compiler -v foo -p .

如果您有文件夹级循环依赖项,则会出现一些类似的错误:

/foo/Sub/UC1.ascx(2): error ASPPARSE: Circular file references are not allowed.

避免此问题的廉价方法是您已经知道的:禁用批处理。现在至少你知道为什么会有效:)

但是,如果可以的话,最好的办法是避免文件夹级循环依赖。如果您开始将每个文件夹视为生成装配的“组件”,那么这实际上是有意义的,并且可以帮助您使网站的各个部分更加模块化。

是的,在编译系统中将其称为“错误”,或者至少是一个限制,这也是公平的。但是一旦你意识到这一点,就很容易避免。

答案 1 :(得分:4)

清除Temporary ASP.NET Files。可能是移动前的控件有一个组件,之后是另一个

答案 2 :(得分:3)

这种错误是由于名称空间造成的。检查所有文件的名称空间,以确保没有重复的文件或名称空间使用错误错误。

答案 3 :(得分:2)

我有时会使用我的网络用户控件来获取此信息。当我编辑不同的文件时,他们会抱怨他们存在两次。我不知道是什么引起了它,但我知道如果我按空格&gt;保存在抱怨控件上它会强制服务器重新编译,之后工作正常。

答案 4 :(得分:2)

您的解决方案中是否有多个项目?

尝试清洁/ bin文件夹(手动)。旧的构建文件可能仍然存在于某处,阻止您构建...

另外,请查看您的参考文献 - 也许您正在复制您引用的内容的定义?

这是一个疯狂的镜头 - 但是你可能已经在GAC中安装了.dll吗?

答案 5 :(得分:2)

我认为其中一些答案可能不合时宜。当你的代码隐藏引用不同版本的程序集而不是web.config时,我已经看到了这一点。 e.g:

(在aspx中引用的版本1.1.0.0和在web.config中引用的1.2.0.0)

MyFile.aspx

<%@ Register TagPrefix="cc1" Namespace="StrongNamed.Namespace" Assembly="StrongNamed, Version=1.1.0.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" %>

的web.config:

<assemblies>
    <add assembly="StrongNamed, Version=1.2.0.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
...

我见过如果两个版本的程序集都在GAC中的情况,那么ASP.NET将为您提供您所描述的错误。

答案 6 :(得分:1)

  • 关闭所有正在运行的visual studio实例。
  • 停止IIS(如果正在运行,否则停止“devserver”事件)
  • 清除ASP.NET Temp文件夹(完全)
  • 清除BIN文件夹
  • 启动IIS(如果正在运行)
  • 启动VS
  • 重建解决方案

答案 7 :(得分:1)

对于很多项目和文件夹,有时可能会破坏名称空间,特别是如果你试图通过使用名称空间声明来强制执行。

要查看这是否真的有问题,我将浏览所有代码文件 - .cs和.designer.cs - 并删除所有命名空间声明,然后重建所有代码以查看是否能解决问题。

你没有提到你正在使用的Visual Studio和.net版本,这可能也有帮助 - 我记得在VS2005中处理过类似的问题。

答案 8 :(得分:1)

我至少遇到过这个问题两次 David Ebbo的回答绝对是解释正在发生的事情的答案。

在我的项目中,我创建了一个动态插入占位符的用户控件 所以控件的代码背后是:

public partial class CustomerAppointmentList : System.Web.UI.UserControl
{
}

请注意,此控件不在任何名称空间中。

在'customer.aspx.cs'的代码后面我动态加载这个用户控件:

{
    var contentControl = (CustomerAppointmentList)LoadControl("../controls/customerappointmentlist.ascx");
}

因为aspx页面中不存在类'CustomerAppointmentList',所以我必须在custmer.aspx中引用它:

<%@ Reference Control="../controls/customerappointmentlist.ascx" %>

当asp.net编译器必须编译customer.aspx时,它将遍及'CustomerAppointmentList'类,并将该类型添加到该文件夹​​的库中。
几秒钟之后,asp.net编译器会将'CustomerAppointmentList'类添加到另一个库中,用于文件夹'controls'。

在外部库(projectname.web.dll)中添加接口“ICustomerAppointmentList”并修改代码后,问题就消失了。 所以:

  1. 删除aspx文件中的“参考”部分。
  2. 为您的用户控件创建一个界面。
  3. 确保'CustomerAppointmentList'类继承自用户控件。
  4. 使用LoadControl时,转换为刚刚创建的界面。
  5. 我的新代码(ascx.cs):

        public partial class CustomerAppointmentList : System.Web.UI.UserControl, ICustomerAppointmentList
    {
    }
    

    (aspx.cs)

    {
    var contentControl = (ICustomerAppointmentList)LoadControl("../controls/customerappointmentlist.ascx");  
    }
    

答案 9 :(得分:1)

尝试删除文件夹“Temporary ASP.Net Files”中的所有文件和文件夹,它位于此路径中:

c:\ windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files

这对我有用

答案 10 :(得分:0)

对我而言,当我将预编译的Web /发布位置设置为当前目录时,就发生了这种情况,这也是网站根文件夹的位置。

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

即。请勿将您网站的已发布版本放在网站的代码文件夹中。

答案 11 :(得分:0)

  1. 首先,您应该使用vs 2013解决此问题。
  2. 第二个错误是因为扩展名为.dll的文件并在浏览器中显示为
  

编译器错误提示:CS0433:类型   “ c:\ Docunts和”中均存在“ ASP.dashboard_badusercontrol_ascx”   设置\我\本地设置\临时\临时ASP.NET   文件\ root \ 3c2b7e1f \ 2e8a7620 \ App_Web_badusercontrol.ascx.a57ad085.iljdmp1p.dll'   和'c:\ Docunts and Settings \ me \ Local Settings \ Temp \ Temporary ASP.NET   文件\ root \ 3c2b7e1f \ 2e8a7620 \ App_Web_bhdqaimy.dll'

因此,您应该删除显示此错误的文件。(App_Web_bhdqaimy.dll)