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

时间:2010-06-30 20:15:21

标签: msbuild reportviewer rdlc

我正在使用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”确实如此   不存在。使用“RdlCompile”任务   从装配   “Microsoft.ReportViewer.Common,   版本= 9.0.0.0,文化=中立,   PublicKeyToken = b03f5f7f11d50a3a“。任务   “RdlCompile”:   Report \ RDLC \ GreenReport.rdlc(0,0):   错误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),解决方案就会编译。

11 个答案:

答案 0 :(得分:7)

这是因为您的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,它指向10.0版本的ReportViewer程序集。

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

答案 1 :(得分:6)

只需安装Microsoft Report Viewer 2010 SP1。

答案 2 :(得分:4)

我有一个非常类似的问题。突然之间,我再也无法构建一个包含.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"/>

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

Jim Lafler

答案 3 :(得分:3)

我尝试重新安装所有它并没有工作。然后,我尝试按照Jim的帖子更新 Microsoft.ReportingServices.targets ,但即使没有为我工作。

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

我在比较时注意到的其他差异,将 PublicKeyToken 版本一起更改。

这可能只适用于我,但Jim的帖子非常有用。

SFUH

答案 4 :(得分:2)

原来我确实需要.Net 4.0 Framework,更具体地说是4.x版本的MSBuild,它使用较新版本的Microsoft.ReportViewer.Common库。

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

答案 5 :(得分:2)

我遇到了同样的问题:我们使用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)的值不正确,所以我在第34节中添加了构建定义;过程&#34;这个MSBuild参数:

/p:VisualStudioVersion=12.0

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

答案 6 :(得分:1)

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

当时:

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...

詹姆斯

答案 7 :(得分:0)

我的devenv.exe.config中启用了NetFx40_LegacySecurityPolicy,当我注释掉这一行时,项目已成功构建。

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

我在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"/>

当我在我的项目中将任务版本更改为对应于dll版本的10.0.0.0时。

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

它&#39;工作

答案 10 :(得分:0)

我刚刚从我的文件系统中删除了这个文件。报告简单嵌入,无需编译。

<块引用>

c:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\V11.0\ReportingServices\Microsoft.ReportingServices.targets

这对我和我的构建服务器都很好。