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

14

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

为了让测试机器正常工作(无需安装VS2010或ReportViewer.exe),我必须将项目中的引用添加到Microsoft.ReportViewer.Winforms、Microsoft.ReportViewer.Common和Microsoft.ReportViewer.ProcessingModel,并将它们全部设置为“Copy Local”。

我已经为rdlc文件配置了Build Action => 嵌入式资源。这是添加新rdlc到项目时的默认设置。如果这可以解决问题(不知道是否相关),我可以进行其他配置。

问题是:自从添加了rdlc文件后,解决方案就无法在构建服务器上构建。我已经在构建服务器上安装了ReportViewer.exe,并验证了所需程序集是否存在于GAC中。构建服务器上没有安装.NET 4框架 - 我认为这不是必需的,因为解决方案的目标是3.5运行时。

我认为问题的根源在于构建日志中的以下内容:

Target "RunRdlCompiler": Building target "RunRdlCompiler" completely. Output file "obj\Release\RdlCompile.compiled" does not exist. Using "RdlCompile" task from assembly "Microsoft.ReportViewer.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". Task "RdlCompile": Report\RDLC\GreenReport.rdlc (0,0): error rsInvalidReportDefinition: 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.

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

11个回答

8
这是因为你的Microsoft.Common.Targets文件指向了9.0版本的程序集。
如果你在[sysdir] \ Microsoft.NET \ Framework \ v3.5中查找,你会找到驱动MSBuild大部分工作的Microsoft.Common.targets。这个版本的共同目标文件指向[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支持时想要的。

现在它已经工作了,我不会再去乱搞它,但是这个解释确实很有启发性——我在Google上搜索了很多关于这个信息的内容,但是什么都没有找到。 - Phil Sandler

7
只需安装Microsoft Report Viewer 2010 SP1即可。

完美的答案。足够简单,而且不需要去修改默认文件,这样可能会在以后给你带来麻烦。 - Jesse
这对我很有效,它不需要我修改任何.targets文件,并且GAC中最新版本的DLL在引用项属性窗口中显示给我。 - David Chen

5
我已经尝试重新安装所有内容,但仍然无法解决问题。接着,我按照Jim的帖子更新了Microsoft.ReportingServices.targets,但是它对我也没有起作用。
最终,我只是从另一台机器上复制了Microsoft.ReportingServices.targets(在那台机器上运行时没有错误)。惊奇的是,它现在可以工作了。
我注意到的一个附加差异是,除了版本之外,我还需要更改PublicKeyToken。
这可能只适用于我的情况,但Jim的帖子确实很有用。
SFUH

5
我曾经遇到过非常相似的问题。突然间,我无法构建包含.rdlc文件的VS2010项目。我没有转换任何报告或使用报告服务器,所有内容都是本地的。我尝试创建一个全新的项目,并添加一个空的rdlc报告,然后点击构建,但它无法工作。有一天,它突然停止编译,并给了我以下错误:
“报告定义无效。详细信息:报告定义具有无效的目标命名空间'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition',无法升级。”
结果发现问题出在我的“C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\ReportingServices\Microsoft.ReportingServices.targets”文件上,该文件不知何故已更改。我的文件顶部如下所示:

而它应该是:

我在文件中更改了那个“Using Task”行,现在一切都可以构建了。真的很令人沮丧,浪费了我两天的时间。希望发布这条评论可以帮助处于类似情况的其他人。
Jim Lafler

3

我有同样的问题:我们正在使用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)的值不正确,所以我在构建定义的"Process"部分添加了这个MSBuild参数:
/p:VisualStudioVersion=12.0

它起作用了!构建成功完成。 希望这能帮助到某些人。


谢谢。经过数小时的尝试解决这个问题,只有这个方法才能解决它。我编辑了项目文件,并将 <VisualStudioVersion Condition="'$(VisualStudioVersion)' ==''">10.0</VisualStudioVersion> 更改为 <VisualStudioVersion>10.0</VisualStudioVersion> - mejobloggs

2
原来我确实需要 .Net 4.0 框架,更具体地说是使用新版本的 Microsoft.ReportViewer.Common 库的 4.x 版本的 MSBuild。
因此,即使您的目标是 3.5 框架,如果您使用 VS2010 创建 rdlc,则它将期望使用 4.0 工具进行“编译”。

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

詹姆斯


0

我在我的Visual Studio 2013上遇到了同样的问题。

我的项目中报告服务的dll版本是Version=10.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a。

当我检查我的ReportingServices targets时,

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

它已经工作了。


0

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

我们在团队中启用了遗留安全策略,以便我们的团队能够在Visual Studio 2010中使用DevExpress 7.2控件,但在这种情况下,显示我们采取的方法并不总是最佳的。


0
由于类似问题,我浪费了2整天的开发时间。在构建项目时它能够成功,但是重新构建却无法通过,而没有显示任何错误。在输出窗口中调查详细的构建日志后,我发现了rdlcompile函数的问题(因此出现了报告服务本地报告嵌入问题)。经过尝试所有方法,我最终设法解决了这个问题,但是需要禁用我的病毒扫描程序。杀毒软件某种程度上干扰了我的重新构建,导致重新构建失败。

禁用病毒扫描后,重新构建可以100%工作


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