将.NET Framework 3.5迁移到4.5时出现错误。

6
我们正在将Web应用程序从.NET Framework 3.5迁移到4.5版本。在开发机器上,我们使用VS2012和运行Windows 7操作系统。在这个过程中,我们遇到了以下错误:
“基类包括字段'htmlTag',但其类型(System.Web.UI.HtmlControls.HtmlGenericControl)与控件类型(System.Web.UI.HtmlControls.HtmlElement)不兼容。”
相应的HTML代码如下:
<html xmlns="http://www.w3.org/1999/xhtml" class="no-js" runat="server" id="htmlTag">

相应的设计师代码是(.cs.designer文件)

protected global::System.Web.UI.HtmlControls.HtmlGenericControl htmlTag;

完整的堆栈跟踪在此处...

System.Web.HttpParseException (0x80004005): 基类包括字段'htmlTag',但其类型(System.Web.UI.HtmlControls.HtmlGenericControl)与控件的类型(System.Web.UI.HtmlControls.HtmlElement)不兼容。在System.Web.Compilation.BaseTemplateCodeDomTreeGenerator.BuildFieldDeclaration(ControlBuilder builder)中发生错误,在System.Web.Compilation.BaseTemplateCodeDomTreeGenerator.BuildSourceDataTreeFromBuilder(ControlBuilder builder, Boolean fInTemplate, Boolean topLevelControlInTemplate, PropertyEntry pse)中发生错误,在System.Web.Compilation.TemplateControlCodeDomTreeGenerator.BuildMiscClassMembers()中发生错误,在System.Web.Compilation.PageCodeDomTreeGenerator.BuildMiscClassMembers()中发生错误,在System.Web.Compilation.BaseCodeDomTreeGenerator.BuildSourceDataTree()中发生错误,在System.Web.Compilation.BaseCodeDomTreeGenerator.GetCodeDomTree(CodeDomProvider codeDomProvider, StringResourceBuilder stringResourceBuilder, VirtualPath virtualPath)中发生错误,在System.Web.Compilation.BaseTemplateBuildProvider.GenerateCode(AssemblyBuilder assemblyBuilder)中发生错误,在System.Web.Compilation.AssemblyBuilder.AddBuildProvider(BuildProvider buildProvider)中发生错误,在System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders()中发生错误,在System.Web.Compilation.BuildProvidersCompiler.PerformBuild()中发生错误,在System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath)中发生错误,在System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)中发生错误,在System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)中发生错误,在System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound)中发生错误,在System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp)中发生错误,在System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath)中发生错误。
为了解决这个问题,我们按照此链接http://support.microsoft.com/kb/941824/en-us中给出的步骤进行操作。
实质上,我们只是剪切了HTML并将其粘贴回去...然后设计师代码被重新生成,如下所示。
protected global::System.Web.UI.HtmlControls.HtmlElement htmlTag;

这似乎是解决问题的逻辑方法,对一些机器也有效,但同样的修复会导致其他开发人员和特别是部署到生产 Web 服务器上的代码出现问题。请注意,我们在生产服务器上运行 Windows Server 2008 R2 Datacenter,并在机器上安装了 .Net Framework 4.5。更改后,我们收到以下错误消息:
“基类包括字段 'htmlTag',但其类型 (System.Web.UI.HtmlControls.HtmlElement) 与控件的类型 (System.Web.UI.HtmlControls.HtmlGenericControl) 不兼容。”
你可以看到错误消息与本帖中第一个错误消息完全相反。
那些现在出错的机器上,如果我们将控件类型保留为HTMLGenericControl,则错误就会消失。
我们尝试比较工作和不工作的机器上与 .net framework 相关的服务包,但我们真的没有注意到任何可能导致错误的东西。
这种情况是不可接受的,因为我们的团队分布在多个地理位置,我们无法与每个人协调解决其本地环境的方法。此外,我们不能使用更改提交此文件,因为它会破坏许多人,并且发布到生产将变得困难。
请帮助我们解决这个问题。

我们的机器上安装了.Net Framework 4.5。但是应用程序池实际上是否配置为使用它呢?(例如在VS中选择CLR进行编译一样,您需要选择服务器端运行的CLR来运行应用程序)。 (应用程序池 - 选择正确的池 - 基本设置 - .Net Framework版本) - tolanj
在IIS中,.Net Runtime版本已经是4.0了。 - Siva Vaddadi
你有检查过 web.config 文件中 <compilation defaultLanguage="c#" targetFramework="4.0"> 类型行吗? - tolanj
是的,这也存在,但问题仍未解决。 - Siva Vaddadi
请查看此帖子:https://dev59.com/yXjZa4cB1Zd3GeqPbTl_ - Kapil
1个回答

2

最后我找到了问题的原因

必须承认这是我的错误,但解决方法非常简单

默认情况下,当项目的目标框架修改为4.5时,会更新web.config文件如下

<system.web>
    <compilation debug="true" targetFramework="4.5"/>
    <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
</system.web>

首先,我们没有意识到升级到4.5版本后VS会修改web.config。其次,我们的Web.Config是一个很大的文件,即使只修改了1行,它也会将整个文件标记为已修改。因此,除非我们通过手动方式明确更改它,否则我们不会将该文件提交到源代码控制。结果导致一些计算机的targetFramework属性设置为4.5,而其他计算机则没有。这就解释了不同计算机之间出现的不一致行为。我们可能需要按照Visual Studio自动编辑的方式格式化web.config,并将其检入源代码控制,以避免今后出现这种问题。
祝好,
Siva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接