【问题标题】:Error while migrating .NET framework 3.5 to 4.5将 .NET Framework 3.5 迁移到 4.5 时出错
【发布时间】:2014-07-24 14:22:38
【问题描述】:

我们正在将我们的 Web 应用程序从 .NET 框架 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.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.Co mpilation.AssemblyBuilder.AddBuildProvider(BuildProvider buildProvider) 在 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 System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound) at Syste m.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) 在 System.Web。 HttpApplication.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 错误方法:无效 AddBuildProvider(System.Web.Compilation.BuildProvider) 帮助链接:

为了解决这个问题,我们按照此链接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 框架相关的服务包,这些服务包在正常工作的机器上与那些不工作的机器上进行比较,我们真的没有注意到任何可能导致错误的东西

这种情况是不可接受的,因为我们的团队分布在多个地理位置,我们无法就修复本地环境的方法与每个团队进行协调。此外,我们无法通过更改签入此文件,因为它会对许多人造成破坏,并且将其发布到生产中也将很困难

您能帮我们解决这个问题吗

【问题讨论】:

  • '我们在机器上安装了 .Net Framework 4.5' -> 但是应用程序的 AppPool 是否实际配置为使用它? (即很像在 VS 中,您选择一个 CLR 进行编译,您选择一个 CLR 在服务器端运行)。 (应用程序池 - 选择合适的 - 基本设置 - .Net Framework版本
  • 在 IIS 中,.Net Runtime 版本已经是 4.0
  • 你检查过web.config type lines吗?
  • 是的,它也存在,但问题仍未解决

标签: asp.net .net


【解决方案1】:

终于找到问题的原因了

不得不承认这是我的错误和一个令人尴尬的简单修复

默认情况下,当项目的目标框架修改为 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 并检查源代码控制以避免将来出现此问题

问候,

湿婆

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多