Windows Forms RDLC:将项目更新为程序包参考格式后,缺少程序集

时间:2019-07-17 09:01:34

标签: c# winforms reportviewer

我有一个Windows Forms应用程序,该应用程序使用本地rdlc文件生成报告。这是一个古老的应用程序,具有多年使用不同版本的rdlc设计器构建的报告(rdlc文件)。在最近的几周中,我已经迁移了该项目,并决定更新csproj文件以使用新的程序包引用格式。旧项目仍在使用旧版本的报表查看器控制,因此我决定遵循instructions并安装Microsoft.ReportingServices.ReportViewerControl.WinForms nuget包。查看csproj,我可以看到它引用了该软件包:

<PackageReference Include="Microsoft.ReportingServices.ReportViewerControl.Winforms">
  <Version>150.1358.0</Version>
</PackageReference>

不幸的是,现在我遇到了一些我不理解的错误。我遇到的第一个错误是报告格式无效。尽管显示了该消息,但似乎问题在于它缺少Microsoft.ReportViewer.ProcessingObjectModel程序集。

这是完整的堆栈错误消息:

Microsoft.Reporting.WinForms.LocalProcessingException: An error occurred during local report processing. ---> Microsoft.Reporting.DefinitionInvalidException: The definition of the report '' is invalid. ---> Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: An unexpected error occurred in Report Processing. ---> System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.ReportViewer.ProcessingObjectModel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The system cannot find the file specified.
   at Microsoft.ReportingServices.RdlExpressions.ExprHostCompiler.InternalCompile(AppDomain compilationTempAppDomain, Boolean refusePermissions)
   at Microsoft.ReportingServices.RdlExpressions.ExprHostCompiler.<>c__DisplayClass33_0.<Compile>b__0()
   at Microsoft.ReportingServices.Diagnostics.RevertImpersonationContext.<>c__DisplayClass1_0.<Run>b__0(Object state)
   at System.Security.SecurityContext.Run(SecurityContext securityContext, ContextCallback callback, Object state)
   at Microsoft.ReportingServices.Diagnostics.RevertImpersonationContext.Run(ContextBody callback)
   at Microsoft.ReportingServices.RdlExpressions.ExprHostCompiler.Compile(IExpressionHostAssemblyHolder expressionHostAssemblyHolder, AppDomain compilationTempAppDomain, Boolean refusePermissions, PublishingVersioning versioning)
   at Microsoft.ReportingServices.ReportPublishing.ReportPublishing.Phase3(ParameterInfoCollection& parameters, Dictionary`2& groupingExprCountAtScope)
   at Microsoft.ReportingServices.ReportPublishing.ReportPublishing.InternalCreateIntermediateFormat(Stream definitionStream, String& description, String& language, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, DataSetInfoCollection& sharedDataSetReferences, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks, Byte[]& dataSetsHash)
   at Microsoft.ReportingServices.ReportProcessing.ReportProcessing.CompileOdpReport(PublishingContext reportPublishingContext, PublishingErrorContext errorContext, String& reportDescription, String& reportLanguage, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, DataSetInfoCollection& sharedDataSetReferences, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks, Byte[]& dataSetsHash)
   at Microsoft.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat(PublishingContext reportPublishingContext)
   --- End of inner exception stack trace ---
   at Microsoft.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat(PublishingContext reportPublishingContext)
   at Microsoft.Reporting.ReportCompiler.CompileReport(ICatalogItemContext context, Byte[] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot& snapshot)
   --- End of inner exception stack trace ---
   at Microsoft.Reporting.ReportCompiler.CompileReport(ICatalogItemContext context, Byte[] reportDefinition, Boolean generateExpressionHostWithRefusedPermissions, ControlSnapshot& snapshot)
   at Microsoft.Reporting.LocalService.GetCompiledReport(PreviewItemContext itemContext, Boolean rebuild, ControlSnapshot& snapshot)
   at Microsoft.Reporting.LocalService.CompileReport()
   at Microsoft.Reporting.WinForms.LocalReport.EnsureExecutionSession()
   --- End of inner exception stack trace ---
   at Microsoft.Reporting.WinForms.LocalReport.EnsureExecutionSession()
   at Microsoft.Reporting.WinForms.LocalReport.GetParameters()
   at WndAssistencias.Views.frmReportViewer..ctor(RelInfo relInfo) in D:\code\work\tfsonline\AssistenciasHelpdesk\WNDASSISTENCIAS\Views\frmReportViewer.cs:line 32
   at WndAssistencias.Presenters.EdicaoPATPresenter.ImprimePatAsync() in D:\code\work\tfsonline\AssistenciasHelpdesk\WNDASSISTENCIAS\Presenters\EdicaoPATPresenter.cs:line 717

好吧,程序集丢失了(我已经确认它不在输出文件夹中)...

如果我没记错的话,当我使用package.config引用时,我必须更改程序集引用属性,以便将它们复制到输出中。不幸的是,VS中的程序集引用列表不再显示报告程序集(它将仅显示nuget包引用!),因此我不确定如何解决此问题。

编辑,只是要补充一点,我尝试将processingObjectModel程序集复制到输出中,但仍然遇到相同的错误。

EDIT2 我已经回到packages.config格式,并且可以正常工作...我有兴趣转向软件包参考,因此如果有人知道如何解决此问题(复制辅助程序到输出文件夹),请让我知道。

有任何线索吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用csproj中的以下代码段强制复制软件包lib \ net40内容:

<PackageReference Include="Microsoft.ReportingServices.ReportViewerControl.WebForms" GeneratePathProperty="true">

...

  <Target Name="CopySSRSPKG" AfterTargets="Build">
    <ItemGroup>
      <SSRSPKG Include="$(PkgMicrosoft_ReportingServices_ReportViewerControl_WebForms)\lib\net40\**\*.*" />
    </ItemGroup>
    <Copy SourceFiles="@(SSRSPKG)" DestinationFiles="@(SSRSPKG->'$(OutDir)\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="true" />
  </Target>

来源:https://github.com/NuGet/Home/issues/4837

我们遇到了同样的问题,谢谢指出!