【问题标题】:MSBuild Using Wrong Version of Assembly to Compile RDLC FileMSBuild 使用错误版本的程序集编译 RDLC 文件
【发布时间】:2021-05-20 08:06:41
【问题描述】:

我正在使用 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"。任务 “Rdl编译”: 报告\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 中),解决方案就会编译。

【问题讨论】:

    标签: msbuild reportviewer rdlc


    【解决方案1】:

    这是因为您的 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 支持时的意图。

    【讨论】:

    • 既然它正在工作,我就不打算搞砸了,但这个解释肯定很有启发性——我在谷歌上下搜索这些信息,却找不到任何东西。
    【解决方案2】:

    只需安装 Microsoft Report Viewer 2010 SP1。

    【讨论】:

    • 完美答案。很简单,它不需要弄乱默认文件,这些默认文件以后可能会在 <...> 中咬你。
    • 这对我有用,它不需要我修改任何 .targets 文件,并且 GAC 中最新版本的 DLL 会在参考项属性窗口中为我显示。
    【解决方案3】:

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

    我更改了文件中的“使用任务”行,一切都重新构建了。真的很令人沮丧,它吞噬了我生命中的两天。希望发表此评论可以帮助处于类似情况的其他人。

    吉姆·拉弗勒

    【讨论】:

      【解决方案4】:

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

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

      我在比较时注意到的额外差异是,将 PublicKeyTokenVersion 一起更改。

      这可能只是我的情况,但 Jim 的帖子非常有用。

      SFUH

      【讨论】:

        【解决方案5】:

        原来我确实需要 .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
          

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

          【讨论】:

          • 谢谢。经过数小时尝试解决此问题后,这是为我解决此问题的唯一方法。我编辑了项目文件并将&lt;VisualStudioVersion Condition="'$(VisualStudioVersion)' ==''"&gt;10.0&lt;/VisualStudioVersion&gt;更改为&lt;VisualStudioVersion&gt;10.0&lt;/VisualStudioVersion&gt;
          【解决方案7】:

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

          曾经:

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

          詹姆斯

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

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

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

              【讨论】:

                【解决方案10】:

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

                成功了。

                【讨论】:

                  【解决方案11】:

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

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

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

                  【讨论】:

                    猜你喜欢
                    • 2021-01-26
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-04-20
                    • 2018-09-12
                    • 2018-05-05
                    • 2018-09-30
                    相关资源
                    最近更新 更多