代码之家  ›  专栏  ›  技术社区  ›  Phil Sandler

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

  •  12
  • Phil Sandler  · 技术社区  · 15 年前

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

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

    我已将rdlc文件配置为生成操作=>嵌入式资源。这是向项目添加新rdlc时的默认设置。如果这能解决这个问题(不知道它是否相关),我愿意配置它。

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

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

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

    10 回复  |  直到 15 年前
        1
  •  8
  •   Matt Greer    15 年前

    这是因为您的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 强制使用9.0版本运行MSBuild。

    [Program Files]\MSBuild\Microsoft\VisualStudio\v10.0\ReportingServices\Microsoft.ReportingServices.targets 它指向ReportViewer程序集的10.0版本。

    10.0ReportViewer是根据.NET3.5编译的,可以在3.5和4.0中使用。您很有可能摆脱.NET4.0框架,修改3.5公共目标文件以指向新的ReportingServices目标文件,它应该可以工作。不管怎么说,理论上我从来没有试过。您最好还是坚持使用4.0,因为这正是我们为新查看器设计MSBuild支持时的初衷。

        2
  •  6
  •   Rob Hruska MegalomanINA    14 年前

    只需安装Microsoft Report Viewer 2010 SP1。

        3
  •  4
  •   AJ.    14 年前

    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.

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

    我更改了文件中的“Using Task”行,所有内容都重新生成。真令人沮丧,它吞噬了我两天的生命。希望发布此评论可以帮助其他类似情况的人。

        4
  •  3
  •   SFUH    13 年前

    我已经尝试重新安装所有,但它没有工作。然后,我试着更新 根据吉姆的职位,但他甚至没有为我工作。

    最后,我只是复制了 Microsoft.ReportingServices.targets文件 从其他机器(在那里它运行没有错误)。令人惊讶的是,它正在发挥作用。

    公钥令牌 随着 .

    这可能只是我的情况,但吉姆的帖子很有用。

        5
  •  2
  •   Phil Sandler    15 年前

    事实证明,我确实需要.NET4.0Framework,更确切地说是4.x版本的MSBuild,它使用的是更新版本的Microsoft.ReportViewer.Common库。

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

        6
  •  2
  •   Sergey    12 年前

    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.
    

    我试图以本文所述的方式修改.NET3.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
    

    成功了!生成已成功完成。

        7
  •  1
  •   Christian Specht    14 年前

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

    是:

    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
  •  0
  •   Tim Ferrell    13 年前

    NetFx40\u LegacySecurityPolicy在我的devenv.exe.config中被启用,当我注释掉这一行时,项目成功构建。

        9
  •  0
  •   user2239566    12 年前

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

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

        10
  •  0
  •   ChiaHoYu    11 年前

    我的项目上reporting service的dll版本为version=10.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a

    当我检查我的ReportingServices目标时

    我发现任务版本是11.0.0.0

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

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

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

        11
  •  0
  •   Simas Joneliunas Kojo Clinton    5 年前

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

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