首页 文章

使用错误版本的程序集编译RDLC文件的MSBuild

提问于
浏览
12

我正在使用VS 2010的reportviewer控件来创建客户端报告(rdlc) . 在我的开发机器上一切正常,当我手动编译(通过VS2010)并手动部署到没有安装开发工具的测试机器时 .

为了使测试机器能够正常工作(不安装VS2010或ReportViewer.exe),我必须在我的项目中添加对Microsoft.ReportViewer.Winforms,Microsoft.ReportViewer.Common和Microsoft.ReportViewer.ProcessingModel的引用并将它们全部“复制本地“ .

我有为Build Action配置的rdlc文件=>嵌入式资源 . 这是向项目添加新rdlc时的默认设置 . 我愿意配置这个,否则如果这会解决这个问题(不知道它是否相关) .

问题:由于添加了rdlc文件,解决方案不再构建在构建服务器上 . 我在构建服务器上安装了ReportViewer.exe,并验证了GAC中是否存在所需的程序集 . .Net 4框架未安装在构建服务器上 - 我不认为这是必需的,因为该解决方案针对3.5运行时 .

我相信问题的根源是构建日志中的以下内容:

目标“RunRdlCompiler”:完全构建目标“RunRdlCompiler” . 输出文件“obj \ Release \ RdlCompile.compiled”不存在 . 使用程序集“Microsoft.ReportViewer.Common,Version = 9.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a”中的“RdlCompile”任务 . 任务“RdlCompile”:Report \ RDLC \ GreenReport.rdlc(0,0):error rsInvalidReportDefinition:报告定义无效 . 详细信息:报表定义具有无效的目标命名空间“http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition”,无法升级 .

据我所知,Microsoft.ReportViewer.Common版本10.0.0.0应该用于“编译”rdlc,但MSBuild似乎使用9.0.0.0 . 我相信如果我可以强制它使用正确的版本(安装在GAC中的IS),解决方案将编译 .

10 回答

  • 2

    这是因为您的Microsoft.Common.Targets文件指向程序集的9.0版本 .

    如果你查看[sysdir] \ Microsoft.NET \ Framework \ v3.5,你会发现 Microsoft.Common.targets ,它正在推动MSBuild的很多工作 . 公共目标文件的这个版本指向 [Program Files]\MSBuild\Microsoft\VisualStudio\v9.0\ReportingServices\Microsoft.ReportingServices.targets 强制MSBuild与9.0版本一起运行 .

    安装.NET 4.0时,v4.0.x目录中有一个新的公共目标文件,这个新文件现在指向 [Program Files]\MSBuild\Microsoft\VisualStudio\v10.0\ReportingServices\Microsoft.ReportingServices.targets ,它指向ReportViewer程序集的10.0版本 .

    10.0 ReportViewer是针对.NET 3.5编译的,旨在兼容3.5和4.0 . 您很可能摆脱.NET 4.0框架,并将您的3.5公共目标文件更改为指向新的ReportingServices目标文件,它应该可以工作 . 无论如何,在理论上,我从未真正尝试过它 . 你可能最好只坚持使用4.0,因为这是我们为新查看器设计MSBuild支持时的预期 .

  • 3

    只需安装Microsoft Report Viewer 2010 SP1即可 .

  • 7

    我有一个非常相似的问题 . 突然之间,我再也无法构建一个包含.rdlc文件的VS2010项目 . 我没有转换任何报告或使用报告服务器,一切都是本地的 . 我尝试创建一个全新的项目并添加一个空的新rdlc报告并点击构建,但它不起作用 . 只有一天它停止编译并给了我以下错误:

    The report definition is not valid. Details: The report definition has an invalid target namespace 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition' which cannot be upgraded.

    原来问题是我的“C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ ReportingServices \ Microsoft.ReportingServices.targets”文件有所改变 . 我的文件顶部是:

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <UsingTask TaskName="Microsoft.Reporting.RdlCompile" AssemblyName="Microsoft.ReportViewer.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>

    它应该是:

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <UsingTask TaskName="Microsoft.Reporting.RdlCompile" AssemblyName="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>

    我在文件中更改了一个“使用任务”行,所有内容都重新构建 . 非常令人沮丧,它吃了我生命中的两天 . 希望发布此评论可能会帮助处于类似情况的其他人 .

    吉姆拉弗勒

  • 0

    我试过重新安装所有它没有工作 . 然后,我按照Jim的帖子尝试更新 Microsoft.ReportingServices.targets 但是甚至没有为我工作 .

    最后,我刚刚从其他机器上复制 Microsoft.ReportingServices.targets (它运行时没有错误) . 令人惊讶的是,它正在发挥作用 .

    我在比较时注意到的额外差异,与 Version 一起更改 PublicKeyToken .

    这可能只适用于我,但吉姆的帖子非常有用 .

    SFUH

  • 2

    结果我确实需要.Net 4.0框架,更具体地说是4.x版本的MSBuild,它使用较新版本的Microsoft.ReportViewer.Common库 .

    因此,即使您的目标是3.5框架,如果您使用VS2010创建rdlc,它也可能会使用4.0工具进行“编译” .

  • 6

    我有同样的问题:我们使用ReportViewer 2012(程序集的版本从11开始) . 在本地计算机和构建计算机上都安装了ReportViewer 2012软件包和VisualStudio 2013.在本地计算机上,VS中的编译成功,但在排队构建期间构建机器上MSBuild会抛出此类错误:

    The report definition is not valid. Details: The report definition has an invalid target 
    namespace 'http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition' 
    which cannot be upgraded.
    

    我尝试从.NET 3.5文件夹中修改Microsoft.Common.targets,这在本文中有所描述,但没有任何效果 . 然后我从.NET 4.0文件夹中打开了Microsoft.Common.targets,发现有这样的字符串:

    <!-- VS10 without SP1 and without VS11 will not have VisualStudioVersion set, so do
    that here -->
    <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)'
    ==''">10.0</VisualStudioVersion>
    </PropertyGroup>
    

    然后我意识到问题可能是变量$(VisualStudioVersion)的值不正确,所以我在“处理”这个MSBuild参数部分中添加了构建定义:

    /p:VisualStudioVersion=12.0
    

    它奏效了!构建成功完成 . 希望这会对某人有所帮助 .

  • 0

    粘贴文件路径似乎没有经过......怎么样:

    是:

    TaskName="Microsoft.Reporting.RdlCompile" AssemblyName="Microsoft.ReportViewer.Common, Version=8.0.0.0...
    

    现在是:

    TaskName="Microsoft.Reporting.RdlCompile" AssemblyName="Microsoft.ReportViewer.WebForms, Version=10.0.0.0...
    

    詹姆士

  • 0

    我的devenv.exe.config中启用了NetFx40_LegacySecurityPolicy,当我评论此行时,项目已成功构建 .

    我们已经在团队中启用了遗留安全策略,以使我们的团队能够在Visual Studio 2010中使用DevExpress 7.2控件,但在这种情况下,它表明我们采用的方法并不总是最好的 .

  • 1

    由于类似问题,我失去了2天的开发时间 . 在构建我的项目时它会成功,但在重建时失败并没有错误 . 在“输出”窗口中调查详细的构建日志时,它指示我遇到rdlcompile函数的问题(因此报告服务本地报告嵌入问题) . 在尝试了每件事之后我终于设法解决了这个问题,但禁用了我的病毒扫描程序 . 防病毒软件以某种方式干扰了我的重建并导致重建失败 .

    禁用病毒扫描后,重建工作100%

  • 4

    我在Visual Studio 2013上遇到同样的问题 . 我项目中报告服务的dll版本是Version = 10.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a

    当我检查我的ReportingServices目标时

    C:\ Program Files \ MSBuild \ Microsoft \ VisualStudio \ v12.0 \ ReportingServices \ Microsoft.ReportingServices.targets

    我发现任务版本是11.0.0.0

    <UsingTask TaskName="Microsoft.Reporting.RdlCompile" AssemblyName="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
    

    当我将任务版本更改为对应于我的proejct上的dll版本的10.0.0.0时 .

    <UsingTask TaskName="Microsoft.Reporting.RdlCompile" AssemblyName="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
    

    有效 .

相关问题