我有一个非常有线的错误,我的一个自定义控件似乎是创建两个编译文件,当我尝试动态加载它时LoadControl()
只是失败,因为无法将一个转换为另一个 - 即使它们完全相同。我写消息看,都是一样的,只是改了编译好的dll。
System.Web.HttpUnhandledException (0x80004005):
Exception of type 'System.Web.HttpUnhandledException' was thrown. --->
System.InvalidCastException:
[A]ASP.Modules_OneProduct_MedioumImage cannot be cast to
[B]ASP.Modules_OneProduct_MedioumImage.
Type A originates from 'App_Web_kg4bazz1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
in the context 'Default'
at location 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\80ed7513\10eb08d9\App_Web_kg4bazz1.dll'.
Type B originates from 'App_Web_oneproduct_mediumimage.ascx.d1003923.4xoxco7b, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
in the context 'Default'
at location 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\80ed7513\10eb08d9\App_Web_oneproduct_mediumimage.ascx.d1003923.4xoxco7b.dll'.
编码
这是我完全遵循MSDN 上所写内容后的代码:
foreach (int OneProductID in TheProductIdArrays)
{
// here is the throw.
ASP.Modules_OneProduct_MedioumImage OneProduct =
(ASP.Modules_OneProduct_MedioumImage)LoadControl(@"~/mod/OneProduct_MediumImage.ascx");
// do some work with
//OneProduct
}
以前我没有加载控件,ASP.
但是在出现此错误并寻找解决方案之后,我严格遵循 MSDN 上的内容。无论我做什么,错误仍然存在。
我也尝试过这两种方法,一种是单独的,另一种是一起的(再次失败)
<%@ Register src="~/mod/OneProduct_MediumImage.ascx" tagname="OneProduct_MediumImage" tagprefix="uc1" %>
<%@ Reference Control="~/mod/OneProduct_MediumImage.ascx" %>
配置
我的 web.config,我尝试了maxBatchSize
20、100、1000,也有optimizeCompilations
true 或 false,但错误再次出现。
<compilation debug="false" defaultLanguage="C#" batch="true"
maxBatchSize="800" batchTimeout="10800" optimizeCompilations="false"
targetFramework="4.0">
现在有一些关于
- 该错误是随机的,在某些编译中出现,在其他一些不出现。
- 这个项目很大,页面上每分钟都有很多人要求看东西,但当里面没有人时也会出现。
- 在 64 位 dot.net 4 上运行,集成
- 作为网络花园运行,但也经过测试,单独使用一个池(并遇到相同的问题)
- 整个项目的会议已结束。
- 这些页面是从 2007 年开始运行的,但这个问题是在上个月出现的,不幸的是我找不到开始的位置和方式,或者是什么触发了它,因为我迟到了几天才看到它。
- 似乎只有一个自定义控件加载,调用繁重的那个。
- 我已经将代码更改了 4 次,进行了小更改或大更改,但仍然存在。
- 我尝试过
optimizeCompilations
真假和同样的问题。 - 我也尝试过停止网络,删除所有临时文件,重新打开,然后又出现了。
- 当应用程序开始只锁定一个编译时,我尝试在 global.asax 上放置一个互斥锁,但这也失败了。
- 从起作用的那一刻起,一切都很好,但如果不起作用,则不会自动更正。
- 我加载此自定义控件的代码存在并在代码的多个位置、不同页面上调用。
- 其他具有类似负载的自定义控件没有任何问题。
- 此自定义控件禁用 ViewState。
- 我也尝试重新定位一些代码,通过微优化更改完整的函数调用,不再失败。
在开发计算机上工作正常。我batch="true"
放在 web.config 上,错误立即出现。- 没有其他类似的问题,例如我们无论如何都无法修复的错误。系统运行了好几天,池根本没有回收,内存稳定,还有更多的免费使用。该程序已运行多年,但我们几乎每天都在更新。
- 在相同的核心代码下运行多个站点(例如 stackexchange)并且都具有相同的随机问题。
- AutoEventWireup 为假
- 它出现在我以相同方式加载的其他自定义控件上。
当出现此错误时,我现在做的解决方法是:我只是强制项目重新编译并进行少量更改,然后错误消失,直到下一次更新。
我有一个错误,试图解决最后几周的树,却找不到原因。我已经尝试了几乎所有我能做的事情,但都失败了,并且错误再次出现。所以我在这里发帖也许有些人可以帮助我并找到解决办法。
最后一句话:这个错误很疯狂,自定义控件是一样的,我在它上面做任何事情我只动态加载它并繁荣,编译器出于某种只有他知道的原因有两次不同的时间 - 随机。
更新 1
我能够在开发人员机器上重现该错误。在那里我发现包含这个自定义控件的两个 dll 模块有不同的。
一个是捆绑在一起的 4 个自定义控件。另一个模块是单独的自定义控件。
解决方法
在尝试修复此错误的树数周后,我最终发现,当编译器批量编译目录并将许多不同的自定义控件捆绑在同一个 dll 中时,会出现此错误。所以当我尝试单独加载它时抛出这个异常。
所以我将有问题的自定义控件单独移动到不同的目录中,似乎我现在避免使用它。
更新 2
再次出现,即使在我将一些文件移动到不同的目录之后。是随机的,找不到明确的关联是什么触发了它。
更新 3
因为我们发现这里的主要问题是在batch="true"
同一个 dll 上编译许多自定义控件的批处理编译 (),所以对编译器说不要这样做的一种方法是maxBatchGeneratedFileSize
参数。我使用它的值为 100,问题再次出现,现在我将它降低到 40 并测试它。
maxBatchGeneratedFileSize="40"