代码之家  ›  专栏  ›  技术社区  ›  dtc

ASP.NET SomeUserControl_Ascx在多处定义错误

  •  0
  • dtc  · 技术社区  · 15 年前

    我在使用ASP.NET时遇到了这个间歇性问题。我的网站是动态编译的。有时当我修改用户控件时,我的网站会抱怨它是在多个地方定义的。似乎旧控件没有从ASP.NET临时文件中删除,更新后的控件被编译到同一目录,因此它在多个位置定义。这对我来说是有意义的,除了我无法控制临时ASP.NET文件文件夹中的内容。

    我已经读到循环引用会导致这种情况。我确保没有循环引用。即使是最简单的网站,我也看到了这种情况。

    我注意到,当使用母版页时,这个错误似乎出现得更频繁。

    我已经读到一个热修复程序试图修复这个问题,但在应用热修复程序后我得到了这个错误。

    如果我得到引起问题的文件并对其进行编辑,那么错误就会消失。即使我只是在文件中放了一个空间,它也能解决这个错误。

    有时,我还可以通过访问可能不使用用户控件的站点的其他页面并单击刷新来解决该错误。这并不总是奏效。

    如果我将站点设置为调试,则不会发生错误。如果我把它设置为一页一页地出现,那么错误不会发生太多,但仍然会发生。

    下面是错误的样子。

    编译错误 描述:在编译 服务此请求所需的资源。请复查 以下特定错误详细信息并修改 适当的源代码。

    编译器错误消息:CS1595:“u asp.header”“u ascx” 在多个位置定义;使用定义 来自“c:\winnt\microsoft.net\framework\v1.0.3705\temporary” ASP.NET文件\root\afwew23d\asdfasd423\asdf23.dll'

    编辑: 我使用的是.NET 2.0(3.5),尽管上面的错误是1.0。我从另一个来源得到了这个错误,因为我不能每次都复制这个问题。但是错误的类型是相同的。

    编辑2: 谢谢你的研究。在您提供的链接中有一条声明:

    即使debug=false,也要注意的一点是,如果您进入其中一个ASPX页面并对其进行更改,则必须重新编译此页面,但这不会导致AppDomain重新加载,因此不会再次批量编译整个应用程序。这就产生了这样的效果:页面现在将被单独重新编译并获得自己的dll,因此不要经常在实时服务器上更改ASPX页面。

    machine.config中有一个设置,用于确定在应用程序域重新启动之前允许多少次重新编译,默认情况下,它设置为15,因此在重新编译15次之后,应用程序域将重新启动,就像您触摸web.config或触按bin目录时一样。

    这似乎意味着,当debug=false并且站点已经被访问和编译时,如果您更改一个页面,它将只编译该页面。听起来可能会引起问题。我曾经认为更改页面或用户控件会导致整个应用程序重新编译。

    1 回复  |  直到 15 年前
        1
  •  1
  •   J.W.    15 年前

    您的Web应用程序的不同文件夹中是否有两个文件名相同的用户控件? 这有时会导致这个问题。

    如果我设置站点来调试错误 从来没有发生过。

    当debug=true时,ASP.NET编译器不进行批编译;当debug=false时,它进行批编译,并可能导致此问题。

    阅读此 post .

    有人就同一个问题进行了谈话。

    回复:ASP.NET内存:如果您的应用程序处于生产状态,那么为什么

    Debug=true 2006年4月24日星期一 下午2:39,罗比·科尔曼,我们确实得到了 用户控件的错误 报告它无法加载 由于存在多个 temp asp.net文件夹中的版本。

    我们发现我们有两个用户 中具有相同文件名的控件 同一个Web应用程序的不同文件夹。 还具有不同的命名空间和 除非我们 设置debug=“false”。我们甚至擦了 临时ASP.NET目录清理 IISRead。

    唯一能解决错误的方法, 是通过重命名其中一个的ascx文件 两者之中。

    这是正确的吗…?有更好的吗 怎么解决这个问题?

    顺便说一句。。。[kissuptext]苔丝,你的帖子 对我们非常有帮助 开发团队,我们真的 感谢您提供的所有信息 已经放弃了。[吻吻]

    回复:ASP.NET内存:如果您的应用程序处于生产状态,那么为什么

    Debug=true 2006年4月25日星期二 上午1:56,泰丝·嗨·罗比,

    感谢您的好评:)

    我假设你正在 CS1595: 'usercontrols.webusercontrol2'是 在多个地方定义;使用 从定义 'C:\windows\microsoft.net\framework\v1.1.4322\临时 ASP.NET 文件\用户控件\293A1A4B\dbb2d387\cisxatg3.dll' “或类似。

    如果你 正在使用src而不是codebehind 您的cs或vb文件包含 完全相同类的定义 在完全相同的命名空间中。这个 错误和你一样 如果你试图编译一个 具有两次定义的另一个类的dll 在同一命名空间中。

    我之所以说它发生在 使用SRC是因为 使用你会得到的代码 编译时出错。

    如果用户控件确实是 同样,我会避免创建副本, 而是使用 其他文件夹。如果他们不同我 要么给不同的名字 如果可能,如果不可能,确保 源类在 不同的命名空间,例如 项目名称.foldername.myusercontrol

    你现在看到它的原因和 以前不是因为你现在 将所有内容成批编译为一个 动态链接库。

    希望这有帮助。