跳至頁尾內容
.NET 幫助

NServiceBus C#(開發人員的工作原理)

NServiceBus 是一個功能強大且適應性強的服務總線,專為 .NET Framework 設計,可簡化分散式系統開發。 它提供的強大訊息傳遞模式保證了跨多個微服務和應用程式的可靠訊息處理和傳遞。 NServiceBus 抽象化了底層訊息傳遞架構,使開發人員能夠專注於業務邏輯,而不是建立分散式系統的複雜性。

相較之下,IronPDF 是一個廣受歡迎的 .NET 程式庫,用於產生、檢視和修改 PDF 檔案。 它以易於使用和高效地從各種來源(如 ASPX 文件和 HTML)創建 PDF 而聞名。

開發人員可以透過結合 NServiceBus 和 IronPDF 來建立可靠、可擴展且易於維護的軟體系統,這些系統可以產生和管理 PDF 文檔,作為其業務運營的一部分。

本文將介紹如何設定一個簡單的 C# NServiceBus 專案並將其與 IronPDF 集成,以便您可以在分散式應用程式架構中建立一個簡化的 PDF 文件管理和生成工作流程。 閱讀完這篇入門教學後,您應該能夠準確地了解這兩種有效技術如何協同工作,從而簡化您在分散式環境中的 PDF 相關任務。

什麼是 C# 中的NServiceBus

NServiceBus 是一個功能強大且適應性強的框架,可輕鬆建立分散式系統和服務導向的 .NET 架構。 利用 NServiceBus,您可以輕鬆管理各種訊息類型並確保可靠的通訊。 這一點至關重要,尤其是在 Web 應用程式和類似架構中,因為無縫的訊息路由和處理是必不可少的。 NServiceBus 的訊息處理程序能夠有效地處理接收訊息,確保每個邏輯元件都能順利互動。 NServiceBus 具有以下重要特性:

NServiceBus C#(開發人員工作原理):圖 1 - NServiceBus C#

NServiceBus 的特性

基於訊息的通信

NServiceBus 鼓勵系統中不同服務或元件之間基於訊息的通訊。 透過解耦組件,這種方法可以創建更易於擴展和管理的設計。

可靠的訊息傳遞

透過自動管理重試、死信佇列和其他容錯技術,它保證了訊息的可靠傳遞。 在分散式系統中,網路中斷和其他故障問題經常發生,這種可靠性至關重要。

發布/訂閱模式

NServiceBus 支援發布/訂閱模式,使服務能夠發布事件並允許其他服務訂閱這些事件。 這使得事件驅動架構成為可能,在這種架構中,對系統中一個元件的事件所做的修改可以引起其他元件的回應。

Saga Management

由於 NServiceBus 整合了對 saga 的支持,因此可以管理長時間運行的業務流程。 Saga 使服務平台能夠管理狀態並協調多個服務之間的複雜操作。

可擴展性和自訂性

它提供了極高的可擴展性,使開發人員能夠個性化訊息的處理、加工和傳輸過程。 由於其適應性強,它可以應用於各種場景。

與各種訊息平台集成

NServiceBus 可與眾多訊息傳遞系統集成,包括 MSMQ、RabbitMQ、Azure Service Bus、Amazon SQS 等。 這使得開發人員能夠選擇最符合其需求的通訊基礎設施解決方案。

使用 C# 建立和配置 NServiceBus

在開始在 C# 專案中使用 NServiceBus 之前,您必須先設定開發環境,建立一個基本項目,並建立一個基本訊息服務和場景。 以下是幫助您入門的逐步指南。

建立一個新的 Visual Studio 項目

在 Visual Studio 中,建立控制台專案的過程很簡單。 在 Visual Studio 環境中,請按照以下簡單步驟啟動控制台應用程式:

請確保在使用前已在電腦上安裝了 Visual Studio。

開始新項目

點選"檔案",然後選擇"新建",最後選擇"項目"。

NServiceBus C#(開發人員使用方法):圖 2 - 點選"新建"

您可以從下方的項目範本參考清單中選擇"控制台應用程式"或"控制台應用程式 (.NET Core)"範本。

請在"名稱"欄中為您的項目提供名稱。

NServiceBus C#(開發人員使用方法):圖 3 - 為專案提供名稱和位置

為項目選擇一個儲存地點。

點擊"建立"將啟動控制台應用程式專案。

NServiceBus C#(開發人員使用方法):圖 4 - 點擊"建立"

安裝 NServiceBus 軟體包

導覽至"工具">"NuGet 套件管理員">"套件管理員控制台"以開啟 NuGet 套件管理員控制台。

執行以下命令安裝 NServiceBus NuGet 套件。

Install-Package NServiceBus

選擇交通工具

NServiceBus 需要傳輸層來接收和傳送訊息。 我們將繼續使用 Learning Transport,因為它易於使用,並且非常適合測試和開發。

透過執行以下命令安裝 Learning Transport 軟體包。

Install-Package NServiceBus.RabbitMQ

配置 NServiceBus

設定端點

Program.cs檔案中設定 NServiceBus 端點設定:

using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;

class Program
{
    static async Task Main()
    {
        Console.Title = "Sender";
        var endpointConfiguration = new EndpointConfiguration("SenderEndpoint");

        // Use RabbitMQ Transport
        var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
        transport.ConnectionString("host=localhost");

        // Set up error queue
        endpointConfiguration.SendFailedMessagesTo("error");

        // Set up audit queue
        endpointConfiguration.AuditProcessedMessagesTo("audit");

        // Start the endpoint
        var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
        Console.WriteLine("Press Enter to send a message...");
        Console.ReadLine();

        // Send a message
        var message = new MyMessage
        {
            Content = "Hello, NServiceBus with RabbitMQ!"
        };
        await endpointInstance.Send("ReceiverEndpoint", message).ConfigureAwait(false);
        Console.WriteLine("Message sent. Press Enter to exit...");
        Console.ReadLine();

        // Stop the endpoint
        await endpointInstance.Stop().ConfigureAwait(false);
    }
}
using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;

class Program
{
    static async Task Main()
    {
        Console.Title = "Sender";
        var endpointConfiguration = new EndpointConfiguration("SenderEndpoint");

        // Use RabbitMQ Transport
        var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
        transport.ConnectionString("host=localhost");

        // Set up error queue
        endpointConfiguration.SendFailedMessagesTo("error");

        // Set up audit queue
        endpointConfiguration.AuditProcessedMessagesTo("audit");

        // Start the endpoint
        var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
        Console.WriteLine("Press Enter to send a message...");
        Console.ReadLine();

        // Send a message
        var message = new MyMessage
        {
            Content = "Hello, NServiceBus with RabbitMQ!"
        };
        await endpointInstance.Send("ReceiverEndpoint", message).ConfigureAwait(false);
        Console.WriteLine("Message sent. Press Enter to exit...");
        Console.ReadLine();

        // Stop the endpoint
        await endpointInstance.Stop().ConfigureAwait(false);
    }
}
$vbLabelText   $csharpLabel

NServiceBus C#(開發人員工作原理):圖 5 - 控制台輸出範例

建立訊息

為了表示該訊息,請新增一個新類別。

public class MyMessage : IMessage
{
    public string Content { get; set; }
}
public class MyMessage : IMessage
{
    public string Content { get; set; }
}
$vbLabelText   $csharpLabel

建立訊息處理程序

要處理該訊息,請新增一個新類別。

using NServiceBus;
using System.Threading.Tasks;

public class MyMessageHandler : IHandleMessages<MyMessage>
{
    public Task Handle(MyMessage message, IMessageHandlerContext context)
    {
        Console.WriteLine($"Received message: {message.Content}");
        return Task.CompletedTask;
    }
}
using NServiceBus;
using System.Threading.Tasks;

public class MyMessageHandler : IHandleMessages<MyMessage>
{
    public Task Handle(MyMessage message, IMessageHandlerContext context)
    {
        Console.WriteLine($"Received message: {message.Content}");
        return Task.CompletedTask;
    }
}
$vbLabelText   $csharpLabel

發送訊息

從端點發送訊息。 借助處理程序,調整你發送訊息的主要方式。

using NServiceBus;
using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        Console.Title = "Receiver";
        var endpointConfiguration = new EndpointConfiguration("ReceiverEndpoint");

        // Serialization configuration
        endpointConfiguration.UseSerialization<NewtonsoftJsonSerializer>();

        // Use RabbitMQ Transport
        var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
        transport.UseConventionalRoutingTopology(QueueType.Quorum);
        transport.ConnectionString("host=localhost");

        // Set up error queue
        endpointConfiguration.SendFailedMessagesTo("error");

        // Set up audit queue
        endpointConfiguration.AuditProcessedMessagesTo("audit");
        endpointConfiguration.EnableInstallers();

        // Start the endpoint
        var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
        Console.WriteLine("Press Enter to exit...");
        Console.ReadLine();

        // Stop the endpoint
        await endpointInstance.Stop().ConfigureAwait(false);
    }
}
using NServiceBus;
using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        Console.Title = "Receiver";
        var endpointConfiguration = new EndpointConfiguration("ReceiverEndpoint");

        // Serialization configuration
        endpointConfiguration.UseSerialization<NewtonsoftJsonSerializer>();

        // Use RabbitMQ Transport
        var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
        transport.UseConventionalRoutingTopology(QueueType.Quorum);
        transport.ConnectionString("host=localhost");

        // Set up error queue
        endpointConfiguration.SendFailedMessagesTo("error");

        // Set up audit queue
        endpointConfiguration.AuditProcessedMessagesTo("audit");
        endpointConfiguration.EnableInstallers();

        // Start the endpoint
        var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
        Console.WriteLine("Press Enter to exit...");
        Console.ReadLine();

        // Stop the endpoint
        await endpointInstance.Stop().ConfigureAwait(false);
    }
}
$vbLabelText   $csharpLabel

NServiceBus C#(開發人員工作原理):圖 6 - 控制台輸出範例

啟動應用程式並建立專案。 控制台應顯示訊息"收到訊息:你好,NServiceBus!"

入門

在 C# 專案中,將 NServiceBus 與 RabbitMQ 和 IronPDF 整合需要配置 NServiceBus 和 RabbitMQ 之間的訊息,以及使用 IronPDF 建立 PDF。 以下是詳細的入門指南:

IronPDF是什麼?

IronPDF 是一個 .NET 程式庫,旨在建立、讀取、編輯和轉換 PDF 文件。 借助它,程式設計師可以使用強大而直觀的工具在 C# 或 VB.NET 應用程式中處理 PDF 文件。 IronPDF 的功能和功能詳述如下:

NServiceBus C#(開發者使用指南):圖 7 - IronPDF:C# PDF 庫首頁

IronPDF 的特點

從 HTML 產生 PDF

將 JavaScript、HTML 和 CSS 轉換為 PDF。 支援媒體查詢和響應式設計,這是兩項現代網路標準。 可用於使用 HTML 和 CSS 產生動態樣式的 PDF 文件、發票和報表。

PDF編輯

在現有的 PDF 檔案中加入文字、圖片和其他內容。 從PDF文件中提取文字和圖片。 將多個PDF文件合併成一個文件。將PDF文件拆分成多個文件。 新增註解、頁尾、頁首和浮水印。

PDF轉換

將 Word、Excel、圖像和其他文件格式轉換為 PDF。 PDF 轉影像(PNG、JPEG 等)。

性能和可靠性

在生產環境中,高效能和高可靠性是設計目標。 高效率管理海量文件。

IronPDF的安裝

開啟 NuGet 套件管理器控制台,安裝 IronPDF。

Install-Package IronPdf

配置發送方訊息

Messages 是一個共用專案(類別庫),發送者和接收者都會使用它。 在 Messages 專案中定義訊息類別。 建立一個名為 Messages 的新類別庫項目,並將其新增至解決方案。

定義訊息:

在 Messages 專案中,建立一個名為GeneratePdfMessage.cs的新類別:

using NServiceBus;

public class GeneratePdfMessage : IMessage
{
    public string Content { get; set; }
    public string OutputPath { get; set; }
}
using NServiceBus;

public class GeneratePdfMessage : IMessage
{
    public string Content { get; set; }
    public string OutputPath { get; set; }
}
$vbLabelText   $csharpLabel

在 Send 和 Receiver 專案中,都要包含 Messages 專案的引用。

在 Sender 專案中設定 NServiceBus 端點,以使用 RabbitMQ 進行訊息傳遞。

using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;

class Program
{
    static async Task Main()
    {
        Console.Title = "Sender";
        var endpointConfiguration = new EndpointConfiguration("SenderEndpoint");

        // Use RabbitMQ Transport
        var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
        transport.ConnectionString("host=localhost");

        // Set up error queue
        endpointConfiguration.SendFailedMessagesTo("error");

        // Set up audit queue
        endpointConfiguration.AuditProcessedMessagesTo("audit");
        endpointConfiguration.EnableInstallers();

        // Start the endpoint
        var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
        Console.WriteLine("Press Enter to send a message...");
        Console.ReadLine();

        // Send a message
        var message = new GeneratePdfMessage
        {
            Content = "<h1>Hello, NServiceBus with RabbitMQ and IronPDF!</h1>",
            OutputPath = "output.pdf"
        };
        await endpointInstance.Send("ReceiverEndpoint", message).ConfigureAwait(false);
        Console.WriteLine("Message sent. Press Enter to exit...");
        Console.ReadLine();

        // Stop the endpoint
        await endpointInstance.Stop().ConfigureAwait(false);
    }
}
using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;

class Program
{
    static async Task Main()
    {
        Console.Title = "Sender";
        var endpointConfiguration = new EndpointConfiguration("SenderEndpoint");

        // Use RabbitMQ Transport
        var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
        transport.ConnectionString("host=localhost");

        // Set up error queue
        endpointConfiguration.SendFailedMessagesTo("error");

        // Set up audit queue
        endpointConfiguration.AuditProcessedMessagesTo("audit");
        endpointConfiguration.EnableInstallers();

        // Start the endpoint
        var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
        Console.WriteLine("Press Enter to send a message...");
        Console.ReadLine();

        // Send a message
        var message = new GeneratePdfMessage
        {
            Content = "<h1>Hello, NServiceBus with RabbitMQ and IronPDF!</h1>",
            OutputPath = "output.pdf"
        };
        await endpointInstance.Send("ReceiverEndpoint", message).ConfigureAwait(false);
        Console.WriteLine("Message sent. Press Enter to exit...");
        Console.ReadLine();

        // Stop the endpoint
        await endpointInstance.Stop().ConfigureAwait(false);
    }
}
$vbLabelText   $csharpLabel

端點配置:透過呼叫 new EndpointConfiguration("SenderEndpoint") 將端點初始化為名稱"SenderEndpoint"。

endpointConfiguration 是傳輸配置。 透過連接到本機 RabbitMQ 實例,UseTransport() 方法將 NServiceBus 設定為使用 RabbitMQ 作為傳輸機制。

稽核佇列和錯誤佇列 失敗訊息和稽核處理訊息的傳送位置分別使用SendFailedMessagesTo(&quot;error&quot;)AuditProcessedMessagesTo(&quot;audit&quot;)進行設定。

訊息已發送: endpointInstance.Send(&quot;ReceiverEndpoint&quot;, message)向 "ReceiverEndpoint" 發送 GeneratePdfMessage。

配置接收器產生 PDF

在 Receiver 專案中設定 NServiceBus 端點,以透過 RabbitMQ 接收訊息並使用 IronPDF 產生 PDF。

using NServiceBus;
using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        Console.Title = "Receiver";
        var endpointConfiguration = new EndpointConfiguration("ReceiverEndpoint");

        // Use RabbitMQ Transport
        var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
        transport.ConnectionString("host=localhost");

        // Set up error queue
        endpointConfiguration.SendFailedMessagesTo("error");

        // Set up audit queue
        endpointConfiguration.AuditProcessedMessagesTo("audit");

        // Start the endpoint
        var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
        Console.WriteLine("Press Enter to exit...");
        Console.ReadLine();

        // Stop the endpoint
        await endpointInstance.Stop().ConfigureAwait(false);
    }
}
using NServiceBus;
using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        Console.Title = "Receiver";
        var endpointConfiguration = new EndpointConfiguration("ReceiverEndpoint");

        // Use RabbitMQ Transport
        var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
        transport.ConnectionString("host=localhost");

        // Set up error queue
        endpointConfiguration.SendFailedMessagesTo("error");

        // Set up audit queue
        endpointConfiguration.AuditProcessedMessagesTo("audit");

        // Start the endpoint
        var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
        Console.WriteLine("Press Enter to exit...");
        Console.ReadLine();

        // Stop the endpoint
        await endpointInstance.Stop().ConfigureAwait(false);
    }
}
$vbLabelText   $csharpLabel

對於"ReceiverEndpoint"接收器端點,此設定與傳送方配置類似。

訊息處理程序

在 Receiver 專案中,建立一個名為GeneratePdfMessageHandler.cs的新類別。

using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;
using IronPdf;

public class GeneratePdfMessageHandler : IHandleMessages<GeneratePdfMessage>
{
    public Task Handle(GeneratePdfMessage message, IMessageHandlerContext context)
    {
        Console.WriteLine($"Received message to generate PDF with content: {message.Content}");

        // Generate PDF
        var renderer = new HtmlToPdf();
        var pdf = renderer.RenderHtmlAsPdf(message.Content);
        pdf.SaveAs(message.OutputPath);
        Console.WriteLine($"PDF generated and saved to: {message.OutputPath}");

        return Task.CompletedTask;
    }
}
using NServiceBus;
using System;
using System.Threading.Tasks;
using Messages;
using IronPdf;

public class GeneratePdfMessageHandler : IHandleMessages<GeneratePdfMessage>
{
    public Task Handle(GeneratePdfMessage message, IMessageHandlerContext context)
    {
        Console.WriteLine($"Received message to generate PDF with content: {message.Content}");

        // Generate PDF
        var renderer = new HtmlToPdf();
        var pdf = renderer.RenderHtmlAsPdf(message.Content);
        pdf.SaveAs(message.OutputPath);
        Console.WriteLine($"PDF generated and saved to: {message.OutputPath}");

        return Task.CompletedTask;
    }
}
$vbLabelText   $csharpLabel

GeneratePdfMessageHandler使用IHandleMessages介面來處理GeneratePdfMessage類型的訊息。

NServiceBus C#(開發人員工作原理):圖 8 - 控制台輸出範例

Handle 方法:收到訊息後, Handle函數使用 IronPDF 建立 PDF。 訊息中的 HTML 內容透過HtmlToPdf渲染器程式碼轉換為 PDF,然後將其儲存到指定的輸出路徑。

NServiceBus C#(開發者使用方法):圖 9 - 使用 NServiceBus、RabbitMQ 和 IronPDF 產生的 PDF 輸出

結論

NServiceBus 可與 RabbitMQ 和 IronPDF 在 C# 中集成,為需要動態、可靠地產生 PDF 的分散式系統提供可擴展、穩定的解決方案。 這種組合利用了 NServiceBus 的訊息處理能力、RabbitMQ 作為訊息代理的可靠性和適應性,以及 IronPDF 強大的 PDF 編輯工具。 由此產生的架構保證了服務之間的解耦,從而實現了自主演進和可擴展性。

即使在網路或應用程式發生故障的情況下,RabbitMQ 也能確保訊息傳遞。 NServiceBus 簡化了訊息路由和處理,而 IronPDF 可以將 HTML 文字轉換為高品質的 PDF 文件。 這種整合提供了一個靈活的框架,用於開發複雜的大規模應用程序,同時提高了系統的可維護性和可靠性。

最後,透過將 IronPDF 和 Iron Software 新增到您的 .NET 程式設計工具包中,您可以有效地處理條碼、產生 PDF、執行 OCR 以及與 Excel 連線。 IronPDF 的授權頁面(從$799開始)無縫融合了其功能以及Iron Software 官方網站靈活套件的性能、相容性和易用性,從而提供額外的 Web 應用程式和功能以及更高效的開發。

如果許可證選項定義明確,並且可以根據專案的特定要求進行定制,那麼開發人員就可以自信地選擇最佳模式。 這些優勢使開發人員能夠有效且透明地處理各種難題。

常見問題解答

如何在 C# 中使用 NServiceBus 進行分散式系統開發?

NServiceBus 透過抽象訊息傳遞架構,簡化了 C# 中的分散式系統開發。這使得開發人員能夠專注於業務邏輯,同時確保跨微服務的可靠訊息處理和傳遞。

將 NServiceBus 與 PDF 管理庫整合有哪些好處?

將 NServiceBus 與 IronPDF 等 PDF 管理庫集成,可在分散式應用程式中有效地產生和管理 PDF,從而實現可擴展和可維護的軟體系統。

如何使用 NServiceBus 和 RabbitMQ 設定 C# 專案?

若要設定包含 NServiceBus 和 RabbitMQ 的 C# 項目,請在 Visual Studio 中建立一個新的控制台應用程序,安裝 NServiceBus 和 RabbitMQ NuGet 套件,並在程式碼中配置端點和訊息傳輸。

NServiceBus 如何增強基於訊息的通訊?

NServiceBus 透過提供可靠的訊息傳遞模式(例如發布/訂閱模型和 saga 管理)來增強基於訊息的通信,確保訊息在分散式系統中正確傳遞和處理。

IronPDF 在使用 NServiceBus 的分散式系統中扮演什麼角色?

IronPDF 在使用 NServiceBus 的分散式系統中發揮著至關重要的作用,它提供了強大的 PDF 生成和操作功能,可整合到訊息驅動的工作流程中,以實現文件處理流程的自動化。

如何使用 C# 在分散式系統中確保可靠地產生 PDF 檔案?

使用 C# 在分散式系統中可靠地產生 PDF 可以透過整合 NServiceBus 進行訊息處理和 IronPDF 進行 PDF 產生來實現,利用 RabbitMQ 的訊息功能來協調任務並確保一致性。

NServiceBus中的發布/訂閱模型是如何運作的?

在 NServiceBus 中,發布/訂閱模型允許服務發布事件,其他服務可以訂閱這些事件。這實現了事件驅動架構,其中一個元件的變更可以觸發其他元件的操作,從而提高系統的回應速度和可擴展性。

NServiceBus中saga管理的意義是什麼?

NServiceBus 中的 Saga 管理對於協調跨多個服務的長時間運行的業務流程至關重要,確保複雜的工作流程在分散式系統中正確且一致地執行。

Jacob Mellor,Team Iron 首席技術官
首席技術長

Jacob Mellor 是 Iron Software 的首席技術官,也是一位富有遠見的工程師,率先開發了 C# PDF 技術。作為 Iron Software 核心程式碼庫的最初開發者,他自公司成立之初便參與塑造了其產品架構,並與執行長 Cameron Rimington 一起將其發展成為一家擁有 50 多名員工、服務於 NASA、特斯拉和全球政府機構的公司。

Jacob 於 1998 年至 2001 年在曼徹斯特大學獲得土木工程一級榮譽學士學位。 1999 年,他在倫敦創辦了自己的第一家軟體公司;2005 年,他創建了自己的第一個 .NET 元件。此後,他專注於解決微軟生態系統中的複雜問題。

他的旗艦產品 IronPDF 和 IronSuite .NET 庫在全球 NuGet 上的安裝量已超過 3000 萬次,其基礎程式碼持續為全球開發者工具提供支援。憑藉 25 年的商業經驗和 41 年的程式設計專長,Jacob 始終致力於推動企業級 C#、Java 和 Python PDF 技術的創新,同時指導下一代技術領導者。