InvalidCastExceptionofSameType-CustomControlLoading尝试使用LoadControl()动态加载它只是失败,因为无法将一个转换为另一个-即使它们完全相同。我写的消息看到的都是一样的,只是改变了编译的dll。System.Web.HttpUnhandledException(0x80004005):引发了“System.Web.HttpUnhandledException”类型的异常。--->System.InvalidCastException:[A]ASP.Modules_OneProduct_MediumImage无法转换为[B]ASP.Modules_OneProduct_MediumImage。类型A源自位置“C:WindowsMicrosoft.NETFramework64v4.0.30319TemporaryASP.NETFilesroot80ed751310eb08d9App_Web_kg4bazz1.dll”的上下文“默认”中的“App_Web_kg4bazz1,版本=0.0.0.0,文化=中性,PublicKeyToken=null”。B类型源自“App_Web_oneproduct_mediumimage.ascx.d1003923.4xoxco7b,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null”在位置“C:WindowsMicrosoft.NETFramework64v4.0.30319TemporaryASP.NETFilesroot80ed751310eb08d9App_Web.ascxmediumimage”的上下文“Default”中.d1003923.4xoxco7b.dll'。代码在我完全遵循MSDN上的内容后,这就是现在的代码:foreach(intOneProductIDinTheProductIdArrays){//这里是throw。ASP.Modules_OneProduct_MediumImageOneProduct=(ASP.Modules_OneProduct_MediumImage)LoadControl(@"~/mod/OneProduct_MediumImage.ascx");//用//OneProduct做一些工作}以前我没有ASP.load控制ASP。但是在得到这个错误并寻找解决方案之后,我完全按照MSDN上的内容进行操作,无论我做什么,这个错误仍然存??在。我也试过这两个,每个一起,一起(再次失败)配置我的web.config,我试过maxBatchSize,也试过optimizeCompilationstrue或false,但错误再次出现。现在一些细节当我得到这个错误时,我现在做的是解决方法:我只是强制项目重新编译一个小的变化,错误消失直到下一次更新。我有一个错误,试图解决最后一个树周以找出原因。我几乎尝试了所有可能的方法,但都失败了,错误又出现了。所以我在这里发帖,也许有人可以帮助我解决这个问题。最后一句话:这个错误太疯狂了,自定义控件是一样的,我对它做的任何事情我都只是动态地加载它然后boom,编译器有两个不同的时间出于某种只有他知道的原因-随机。更新1我能够在开发人员机器上重现错误。在那里我发现包含这个自定义控件的两个DLL模块是不同的。一个是一组4个自定义控件。另一个模块是一个单独的自定义控件。解决方法在尝试修复此错误树数周后,我最终发现当编译器批处理编译目录并将许多不同的自定义控件捆绑在同一个dll中时,会发生此错误。所以当我尝试单独加载它时抛出这个异常。所以我将有问题的自定义控件单独移动到另一个目录中,现在看来我正在避免使用它。更新2即使我将一些文件移动到另一个目录后,它也会再次发生。是随机的,找不到与其触发器的明确联系。更新3因为我们发现这里的主要问题是批编译(batch="true"),它在同一个dll上编译许多自定义控件,所以告诉编译器不要这样做的一种方法是maxBatchGeneratedFileSize参数。我用了100的值,问题又出现了,现在调低到40再测试。当使用maxBatchGeneratedFileSize="40"打开批处理并且您在目录级别有某种形式的循环引用时,可能会发生这种情况。请查看此答案以了解“循环引用”在这种情况下的确切含义,因为其含义非常微妙。如果您设法打破循环(例如,通过将用户控件移到别处),您将不会遇到此问题。更新1我认为理论上这只能由循环引起,但有时很难发现。我会给你一个替代解决方案,我认为它会起作用并且很容易尝试(即使它有点hack)。在出现问题的用户控件中,将以下属性添加到指令中:如果您在其他控件中看到此属性,则可以添加相同的内容,但对于dummy2、dummy3等...这将无效在这个用户控件上,批处理的效果是因为它与其他用户控件有不同的编译要求。从技术上讲,您可以添加任何C#命令行作为CompilerOptions,但dummy/define是最简单和最无害的。但与全局关闭批处理不同,性能影响将是最小的,因为只有非常小的页面子集不会被批处理。顺便说一句,不用说,您看到的是ASP.NET中的错误,而且该错误已有10多年历史了!也许它应该在某个时候得到修复:)为了找出问题的原因,我认为了解控件的创建方式很重要。请参阅以下内容:Converting.ascxusercontrolstoredistributablecustomcontrols。第1步:编写用户控件要创建用户控件,最好从一个仅包含ascx的空应用程序开始。虽然用户控件是使用“标准”技术创作的,但您需要了解一些限制才能将它们成功转换为独立的自定义控件。主要限制是用户控件需要是独立的。也就是说,它不能依赖于app_Code或global.asax等应用程序全局内容。这样做的原因是因为目标是将UserControl变成一个独立的DLL,如果它依赖于不属于该DLL的代码,它将在其他应用程序中中断。此规则的一个例外是UserControl可能依赖于bin目录(或GAC)中的程序集。在其他应用程序中使用自定义控件时,您只需确保其他程序集始终可用。和第3步:使用发布命令预编译站点(...)选择“使用固定命名和单页程序集”。这将保证您的用户控件将编译成一个名称基于ascx文件的程序集。如果未选中此选项,则用户控件可以与其他页面和用户控件(如果有)一起编译,程序集将获得一个更难用的随机名称。在我看来,您很可能已将用户控件编译并注册为GAC中的单独程序集,并且还包含在您的Web应用程序DLL中。注意:也许这应该是一条评论,但我想包括上述链接中的引号。我希望它有效。在升级后的ASP.NET网站上进行大量调试后,我的最后一个错误是运行时的这个错误。我刚刚检查了构建/发布选项“使用固定命名和单页程序集”,它解决了我的问题:)这里有一些有用的链接:https://msdn.microsoft.com/en-us/library/hh475319(v=vs.110).aspxhttps://msdn.microsoft.com/en-us/library/aa479044.aspxhttp://forums.asp.net/t/960707.aspx我最近编译了asp。netMVC4并将新的DLL导入到项目中。不知何故,我在web.config中引用了旧版本的DLL(包括views文件夹中的web.config)我的案例中的错误被抛出,因为这两个DLL是不同的版本。4.0.0和4.1.0。也许你应该调查一下。也许指定编译文件的版本(我猜是DLL)我希望这能帮助你。其他提示:我猜你有某种版本控制系统?如果是,请在从这里开始之前恢复所有更改,并仔细查看代码以及更改了哪些模型/控件以及如何更改。如果您不使用VCS...您无法恢复更改。您应该开始使用VCS。我注意到有时设计器会创建第二个CodeBehind设计器文件,例如您会:如果没有选中“显示所有文件”选项,您不会注意到,但对于Web项目,编译器将编译该文件夹中的所有文件,而不仅仅是项目中包含的文件。其次,如果你的项目是“网站项目”,没有命名空间,会导致很多奇怪的bug。看看这个问题:NamespaceIssues.net最后,我设法通过在控制文件上设置ClassName属性来解决看似随机的UserControl错误,例如:以上是C#学习教程:InvalidCastExceptionforObjectofthesametype-CustomControlLoading如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
