如何使用 .NET 5.0 在桌面应用程序中呈现 RDLC 报告?

How to render RDLC reports in a desktop application using .NET 5.0?

我的应用程序是一个桌面 WPF/WinForms 应用程序,其中包含大约一百个高度自定义的报告,有些甚至在报告本身中使用了代码。我愿意失去报表查看器,但我需要 PDF、Excel 和 Word 的报表渲染器。

桌面应用程序需要 Windows(即使在 .NET 5.0 中),Windows 已经有 .NET Framework 并且只要有 Windows 和您的桌面应用程序就会支持它,因此您不需要在使用 .NET Framework 呈现报告的服务器上提供服务。 “简单”的解决方案是拥有一个呈现报告并使用 .NET Framework 的控制台项目。所有其他项目都可以使用 .NET 标准或 .NET 5.0。控制台应用程序当然不会引用您的 .NET 标准或 .NET 5.0 项目。我在 .NET 5 中还有一个额外的报告项目,它将是一个报告接口的实现,当有一天我完全放弃 Framework 时,当新的 .NET 出现一个成熟的 RDLC 渲染器时,我可以替换它。

.NET 5.0 应用程序将通过调用控制台应用程序并以这种方式获取呈现的报告来请求报告呈现:

.NET 5.0 应用程序:

    var process = new Process();
    var info = new ProcessStartInfo
    {
        FileName = "SyriliumRiF.ReportsGenerator.exe",
        //Arguments = "command line arguments to your executable",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    };
    process.StartInfo = info;
    process.Start();

    var base64EncodedData = process.StandardOutput.ReadToEnd();
    var reportBytes = System.Convert.FromBase64String(base64EncodedData);

控制台 .NET Framework 应用程序:

class Program
{
    static void Main(string[] args)
    {
        byte[] reportBytes = RenderReport(args);
        string str = Convert.ToBase64String(reportBytes);
        Console.Write(str);
    }
}

我在 .NET 5 应用程序中对报告查看器的调用没有改变,我没有为框架呈现应用程序中的报告生成数据源。

渲染控制台应用接收的输入:报告名称、报告参数和带有 xml 序列化数据表的文件。 通过这种方式,我能够脱离 .NET Framework 并在短短几天的工作中呈现 100 多个报告。

我遇到了同样的情况,我发现解决这个问题的最好方法 问题是将报告项目隔离到单独的服务中 或 exe 应用程序,

然后使用 Inter-process communication 在您的应用和报告系统之间进行通信。

我找到的最佳选择是

  • MagicOnion

    • 因为它建立在 gRPC 之上 但无需编写 .proto(protocol buffer) 合约的复杂性,它可以直接将合约数据映射到 .Net Types
    • 这里的问题是服务器必须是 .Net 应用程序,所以你应该让你的主应用程序成为服务器,然后报告 app/service: 客户端
  • Pipes,效果很好,但请仔细阅读文档以确保它满足您的需求

  • grpc-dotnet-namedpipes 这对你的情况来说可能更好,因为它是

    • Windows C#/.NET 中 gRPC 的命名管道传输:如此高性能
    • 支持 .NET Framework 4.6+ (Windows):客户端和服务器
    • 支持 .NET Core 2.1+ (Windows):客户端和服务器
  • 对于不同的选项 old/ may legacy Local Machine Interprocess Communication with .NET