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

时间:2014-07-24 14:22:39

标签: asp.net .net

我们正在将我们的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):基类包含字段&#39; htmlTag&#39;,但其类型(System.Web.UI.HtmlControls.HtmlGenericControl)与控件类型不兼容( System.Web.UI.HtmlControls.HtmlElement)。 System.Web.Compilation.Base上的System.Web.Compilation.BaseTemplateCodeDomTreeGenerator.BuildFieldDeclaration(ControlBuilder构建器),System.Web.Compilation.BaseTemplateCodeDomTreeGenerator.BuildSourceDataTreeFromBuilder的System.Web.Compilation.BaseTemplateCodeDomTreeGenerator.BuildSourceDataTreeFromBuilder(ControlBuilder构建器,Boolean fInTemplate,Boolean topLevelControlInTemplate,PropertyEntry pse) ,布尔fInTemplate,布尔值topLevelControlInTemplate,PropertyEntry pse)位于System.Web.Complation.Bs上的System.Web.Compilation.CopDomTreeGenerator.BuildMiscClassMembers(),System.Web.Compilation.BaseCodeDomTreeGenerator.BuildMiscClassMembers() System.Web.Co上System.Web.Compilation.BaseTemplateBuildProvider.GenerateCode(AssemblyBuilder assemblyBuilder)的.Compilation.BaseCodeDomTreeGenerator.GetCodeDomTree(CodeDomProvider codeDomProvider,StringResourceBuilder stringResourceBuilder,VirtualPath virtualPath)系统中System.Web.Compilation.BuildProvidersCompiler.PerformBuild()的System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders()处的System.Web.Compilation.AssemblyBuilder.AddBuildProvider(BuildProvider buildProvider)上的mpilation.AssemblyBuilder.AddBuildProvider(BuildProvider buildProvider)。 System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert的System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath,Boolean noBuild,Boolean allowCrossApp,Boolean allowBuildInPrecompile,Boolean throwIfNotFound,Boolean ensureIsUpToDate)中的Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath) (HttpContext上下文,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)at Syste System.Web上的System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext上下文,String requestType,VirtualPath virtualPath,String physicalPath)中的m.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath,Type requiredBaseType,HttpContext context,Boolean allowCrossApp)。 System.Web.HttpApplication.ExecuteStep中的HttpApplication.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()(IExecutionStep step,Boolean&amp; completedSynchronously)错误方法:Void 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。以下是我们在更改后得到的错误

  

基类包括字段&#39; htmlTag&#39;但它的类型(System.Web.UI.HtmlControls.HtmlElement)与控件类型不兼容(System.Web.UI.HtmlControls.HtmlGenericControl)

您会看到错误消息与此帖子中的第一条错误消息正好相反

在那些现在出错的机器中,如果我们将控件的类型保留为HTMLGenericControl,则错误就会消失

我们试图在工作的机器上比较.net框架相关的服务包与那些没有的工具包,我们真的没有注意到可能导致错误的任何东西

这种情况是不可接受的,因为我们的团队分布在多个地理位置,我们无法与每个团队协调解决当地环境的方法。更多的事情我们无法通过更改来签入此文件,因为它会为许多人打破并将其发布到生产中也很困难

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

1 个答案:

答案 0 :(得分:2)

最后我找到了问题的原因

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

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

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

首先我们没有意识到VS会在升级到4.5时修改web.config。其次,我们的Web.Config是一个大文件,即使修改了1行,它仍然会将整个文件显示为已修改。因此,除非我们手动明确地更改它,否则我们从不打算将文件签入源代码控制。因此,一些机器将targetFramework属性设置为4.5,而其他机器则没有。这解释了跨机器的不一致行为。我们可能需要按照visual studio进行自动编辑的方式格式化web.config,并检查源cnotrol以避免将来出现此问题

此致

希瓦