跳至頁尾內容
開發者更新

dotnetify.NET(對開發者如何理解的工作)

DotNetify 是一個開源框架,由 .NET 和 Blazor 製作,旨在於 .NET 平台上建立即時網路應用程式。 藉由利用 SignalR 的強大功能來進行客戶端與伺服器之間的即時交互,它簡化了動態和互動網路應用程式的構建。 DotNetify 提供了一個能同步化客戶端視圖與伺服器端腳本資料的程式設計模型,讓開發者能快速且容易地設計出豐富、響應式且高效能的線上介面。

反之,IronPDF PDF 生成庫是一個強大的 .NET 套件,可以以程式化的方式建立、編輯和操作 PDF 文件。 對於建立動態、資料驅動的文件如報告、發票及表單,這是一個絕佳選擇,同時提供直觀的 API 來將 HTML 文字轉換為 PDF。

透過結合 DotNetify 和 IronPDF,確保即時網路互動性和強大的 PDF 生成能力在 C# 應用程式中得以結合。 此整合對於需要即時資料顯示及能夠根據最新資料動態建立並分發 PDF 文件的應用程式特別有利。 開發者可以透過 IronPDF 的多功能 PDF 生成與 DotNetify 的即時資料同步,建立能滿足複雜業務需求並提升使用者體驗的廣泛互動線上應用程式。

什麼是 DotNetify?

DotNetify 是一個開源框架,旨在簡化使用 .NET 和 Blazor 建立互動即時網路應用程式的過程。 開發者可以透過利用 SignalR,在客戶端與伺服器之間促進即時通信,建立動態和響應式的使用者介面,輕鬆同步伺服器端資料。 DotNetify 使用反應式程式設計方法,抽象化即時資料綁定和事件處理的複雜性,簡化以最少程式碼構建複雜線上應用程式的過程。

dotnetify .NET (開發者如何運作):圖 1

DotNetify 允許開發者構建伺服器端視圖模型,即時將更改置入客戶端,確保使用者介面始終反映應用程式的狀態。 該框架在選擇客戶端技術上提供了靈活性,支持經典的 JavaScript 前端及 Blazor 前端。 由於其易於使用和高效,對於需要即時更新的應用程式,例如儀表板、協作工具和即時資料流,非常理想。

DotNetify 的即時處理複雜交互和資料流顯著增強了使用者體驗,能夠實現平滑的資料同步和即時反饋。 總體來說,DotNetify 對於希望快速高效地構建反應式、尖端、即時線上應用程式的 .NET 開發者來說是一個寶貴的工具。

DotNetify 的特點

C# 中的 DotNetify 提供多種功能,簡化了建立互動即時線上應用程式的過程,包括:

  • 即時通信:利用 SignalR 進行雙向即時的客戶端伺服器通信,實現互動的使用者介面和瞬時更新。
  • 反應式程式設計模型:提供一個反應式程式設計模型,自動同步客戶端視圖和伺服器端視圖模型,以使使用者介面時刻保持最新資訊。
  • 伺服器端視圖模型:促進了伺服器端視圖模型的建立,客戶端元件可以綁定其中的簡化狀態管理和應用程式內部資料流。
  • Blazor 與 JavaScript 支持:支持經典的 JavaScript 前端與 Blazor 前端,允許開發者選擇最符合他們需求的客戶端技術。
  • 整合簡便性:無縫整合即時功能到新專案或現有專案,且與 WebSockets 等前端 UI 組件框架良好運作,能融入使用 React Native、Vue 和 Blazor 的專案。
  • 擴展性:繼承 SignalR 的擴展性特點,使應用能夠有效管理許多併發連接。
  • MVVM 架構:採用模型-視圖-視圖模型 (MVVM) 架構,協助分離責任、保持有組織且清晰的程式碼。
  • 事件處理:通過簡化事件處理和資料綁定,減少處理 UI 交互和狀態變更所需的樣板程式碼。
  • 擴展性和自定義化:提供擴展點和掛鉤,用於行為自定義和與其他程式庫或框架所需的整合。
  • 堅實基礎設施:提供一個動態路由機制,可以在後端完全定義,能夠實現巢狀路由、基於 token 的身份驗證等。
  • 開源和社群驅動:作為開源專案,DotNetify 受益於社群參與和貢獻,確保持續升級和改進。

Creating and Configuring DotNetify in C

要在 C# 網路應用程式中設立一個簡單的專案並開始配置 DotNetify,請按照以下步驟進行。 本教程演示了如何使用 ASP.NET Core 和 Blazor 來設置基本的 DotNetify 伺服器和客戶端。

設立新的 ASP.NET Core Blazor 伺服器專案

  1. 打開 Visual Studio:啟動 Visual Studio 並建立一個新專案。
  2. 建立 Blazor 伺服器應用程式:從專案模板中選擇 Blazor 伺服器應用程式模板,並點按"下一步"。
  3. 配置您的專案:為專案提供名稱(例如"DotNetifyWebApp"),並做必要的配置更改。 點按"建立"。

透過 NuGet 安裝 DotNetify

  1. 管理 NuGet 套件:在方案總管中,右鍵點擊您的專案,然後選擇"管理 NuGet 套件"。
  2. 搜尋 DotNetify:安裝 DotNetify 和 DotNetify.Blazor 套件。

配置 DotNetify

要配置 DotNetify,請打開 Startup.cs 然後使用 ConfigureServicesConfigure 方法。

using DotNetify;
using DotNetify.Blazor;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
        services.AddServerSideBlazor();
        services.AddSignalR();
        services.AddDotNetify();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapBlazorHub();
            endpoints.MapFallbackToPage("/_Host");
            endpoints.MapHub<DotNetifyHub>("/dotnetify");
        });
    }
}
using DotNetify;
using DotNetify.Blazor;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
        services.AddServerSideBlazor();
        services.AddSignalR();
        services.AddDotNetify();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapBlazorHub();
            endpoints.MapFallbackToPage("/_Host");
            endpoints.MapHub<DotNetifyHub>("/dotnetify");
        });
    }
}
Imports DotNetify
Imports DotNetify.Blazor

Public Class Startup
	Public Sub ConfigureServices(ByVal services As IServiceCollection)
		services.AddRazorPages()
		services.AddServerSideBlazor()
		services.AddSignalR()
		services.AddDotNetify()
	End Sub

	Public Sub Configure(ByVal app As IApplicationBuilder, ByVal env As IWebHostEnvironment)
		If env.IsDevelopment() Then
			app.UseDeveloperExceptionPage()
		Else
			app.UseExceptionHandler("/Error")
			app.UseHsts()
		End If

		app.UseHttpsRedirection()
		app.UseStaticFiles()
		app.UseRouting()
		app.UseEndpoints(Sub(endpoints)
			endpoints.MapBlazorHub()
			endpoints.MapFallbackToPage("/_Host")
			endpoints.MapHub(Of DotNetifyHub)("/dotnetify")
		End Sub)
	End Sub
End Class
$vbLabelText   $csharpLabel

建立 ViewModel

在您的專案中建立一個新的類文件(例如 HelloWorldViewModel.cs),並設計一個基本的 ViewModel。

using DotNetify;

public class HelloWorldViewModel : BaseVM
{
    public string Greetings => "Hello, World!";
}
using DotNetify;

public class HelloWorldViewModel : BaseVM
{
    public string Greetings => "Hello, World!";
}
Imports DotNetify

Public Class HelloWorldViewModel
	Inherits BaseVM

	Public ReadOnly Property Greetings() As String
		Get
			Return "Hello, World!"
		End Get
	End Property
End Class
$vbLabelText   $csharpLabel

註冊 ViewModel

在註冊 ViewModel 之前,請打開 Program.cs

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            .ConfigureServices(services =>
            {
                services.AddTransient<HelloWorldViewModel>();
            });
}
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            .ConfigureServices(services =>
            {
                services.AddTransient<HelloWorldViewModel>();
            });
}
Imports Microsoft.AspNetCore.Hosting
Imports Microsoft.Extensions.DependencyInjection
Imports Microsoft.Extensions.Hosting

Public Class Program
	Public Shared Sub Main(ByVal args() As String)
		CreateHostBuilder(args).Build().Run()
	End Sub

	Public Shared Function CreateHostBuilder(ByVal args() As String) As IHostBuilder
		Return Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(Sub(webBuilder)
				webBuilder.UseStartup(Of Startup)()
		End Sub).ConfigureServices(Sub(services)
				services.AddTransient(Of HelloWorldViewModel)()
		End Sub})
	End Function
$vbLabelText   $csharpLabel

建立 Blazor 元件

在您的專案中,新增一個新的 Blazor 元件(例如 HelloWorld.razor),並將其連結到 ViewModel。

@page "/"

@using DotNetify
@using DotNetify.Blazor
@inject IDotNetifyService DotNetify

<h3>@greetings</h3>

@code {
    private string greetings;

    protected override async Task OnInitializedAsync()
    {
        var vm = await DotNetify.ConnectAsync<HelloWorldViewModel>(this);
        greetings = vm.Greetings;
    }
}
  • 設置應用程式以使用 DotNetify、Blazor、Razor Pages 和 SignalR。
  • 配置 DotNetify 和 Blazor 端點及路由。
  • 描述具有問候語的基本 ViewModel,使其能返回屬性。
  • 將 HelloWorldViewModel 作為服務註冊。
  • Blazor 元件與 HelloWorldViewModel 建立連接,檢索歡迎文字並將其顯示在螢幕上。

dotnetify .NET (開發者如何運作):圖 2

入門

要使用 DotNetify 和 IronPDF,您需要建立一個 .NET 專案並將這兩套庫合併到應用程式中。 這裡有一個逐步的教程指南來幫助您入門:

什麼是IronPDF?

功能豐富的 .NET 程式庫IronPDF PDF 庫使 C# 程式能夠製作、讀取和編輯 PDF 文件。 使用這個程式庫,開發人員可以快速將 HTML、CSS 和 JavaScript 資訊轉換為高品質且適合列印的 PDF。 主要任務包括新增標題與頁腳、拆分及合併 PDF、為文件新增水印,以及將 HTML 轉換為 PDF。

IronPDF 因為同時支持 .NET Framework 與 .NET Core,所以與多種應用程式相關。 由於其易於使用和豐富的資訊,PDF 可以輕鬆整合到開發者的產品中。 IronPDF 處理複雜的資料布局和格式,確保其生成的 PDF 與客戶原始 HTML 文字緊密相似。 此外,IronPDF 支持跨平台應用程式,如 Windows、網頁和移動環境。

dotnetify .NET (開發者如何運作):圖 3

IronPDF的功能

  • 從 HTML 生成 PDF:將 JavaScript、HTML 和 CSS 轉換為 PDF。 IronPDF 支持媒體查詢和響應式設計這兩個現代網路標準。 它對現代網路標準的支持對於用 HTML 和 CSS 動態裝飾 PDF 發票、報告和文件尤為有用。

  • PDF 編輯:可以向已存在的 PDF 新增文字、圖片和其他內容。 開發者可以使用 IronPDF 從 PDF 檔中提取文字和圖像,將多個 PDF 合併為一個文件,將 PDF 拆分為多個獨立的文件,並加入水印、註釋、標頭和頁腳。

  • PDF 轉換:將多種文件格式(包括 Word、Excel 和圖片文件)轉換為 PDF 格式。 IronPDF 也支持 PDF 轉換為圖片(如 PNG、JPEG 等)。

  • 性能和可靠性:在工業環境中,性能和可靠性是重要的設計品質。 使用 IronPDF,開發者可以輕鬆管理大量文件集。

安裝IronPDF

要獲得在 .NET 專案中使用 PDF 所需要的工具,請安裝 IronPDF 套件。

Install-Package IronPdf

將 DotNetify 與 IronPDF 整合

配置 DotNetify:

啟動配置:打開 Startup.cs,並使用 ConfigureServicesConfigure 方法配置 DotNetify。

using DotNetify;
using DotNetify.Blazor;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
        services.AddServerSideBlazor();
        services.AddSignalR();
        services.AddDotNetify();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapBlazorHub();
            endpoints.MapFallbackToPage("/_Host");
            endpoints.MapHub<DotNetifyHub>("/dotnetify");
        });
    }
}
using DotNetify;
using DotNetify.Blazor;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
        services.AddServerSideBlazor();
        services.AddSignalR();
        services.AddDotNetify();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapBlazorHub();
            endpoints.MapFallbackToPage("/_Host");
            endpoints.MapHub<DotNetifyHub>("/dotnetify");
        });
    }
}
Imports DotNetify
Imports DotNetify.Blazor

Public Class Startup
	Public Sub ConfigureServices(ByVal services As IServiceCollection)
		services.AddRazorPages()
		services.AddServerSideBlazor()
		services.AddSignalR()
		services.AddDotNetify()
	End Sub

	Public Sub Configure(ByVal app As IApplicationBuilder, ByVal env As IWebHostEnvironment)
		If env.IsDevelopment() Then
			app.UseDeveloperExceptionPage()
		Else
			app.UseExceptionHandler("/Error")
			app.UseHsts()
		End If

		app.UseHttpsRedirection()
		app.UseStaticFiles()
		app.UseRouting()
		app.UseEndpoints(Sub(endpoints)
			endpoints.MapBlazorHub()
			endpoints.MapFallbackToPage("/_Host")
			endpoints.MapHub(Of DotNetifyHub)("/dotnetify")
		End Sub)
	End Sub
End Class
$vbLabelText   $csharpLabel

建立 ViewModel

在專案中新增新類文件(例如 PdfViewModel.cs),並建立會產生 PDF 的 ViewModel。

using DotNetify;
using IronPdf;

public class PdfViewModel : BaseVM
{
    public string PdfUrl { get; set; }

    public void GeneratePdf()
    {
        // Create a new PDF renderer instance
        var Renderer = new ChromePdfRenderer();

        // Render HTML as a PDF document
        var PdfDocument = Renderer.RenderHtmlAsPdf("<h1>Hello World!</h1>");

        // Define the output path for saving the PDF
        var OutputPath = "wwwroot/PdfFiles/HelloWorld.pdf";

        // Save the generated PDF document
        PdfDocument.SaveAs(OutputPath);

        // Update the property for the PDF URL
        PdfUrl = "/PdfFiles/HelloWorld.pdf";
        Changed(nameof(PdfUrl));
    }
}
using DotNetify;
using IronPdf;

public class PdfViewModel : BaseVM
{
    public string PdfUrl { get; set; }

    public void GeneratePdf()
    {
        // Create a new PDF renderer instance
        var Renderer = new ChromePdfRenderer();

        // Render HTML as a PDF document
        var PdfDocument = Renderer.RenderHtmlAsPdf("<h1>Hello World!</h1>");

        // Define the output path for saving the PDF
        var OutputPath = "wwwroot/PdfFiles/HelloWorld.pdf";

        // Save the generated PDF document
        PdfDocument.SaveAs(OutputPath);

        // Update the property for the PDF URL
        PdfUrl = "/PdfFiles/HelloWorld.pdf";
        Changed(nameof(PdfUrl));
    }
}
Imports DotNetify
Imports IronPdf

Public Class PdfViewModel
	Inherits BaseVM

	Public Property PdfUrl() As String

	Public Sub GeneratePdf()
		' Create a new PDF renderer instance
		Dim Renderer = New ChromePdfRenderer()

		' Render HTML as a PDF document
		Dim PdfDocument = Renderer.RenderHtmlAsPdf("<h1>Hello World!</h1>")

		' Define the output path for saving the PDF
		Dim OutputPath = "wwwroot/PdfFiles/HelloWorld.pdf"

		' Save the generated PDF document
		PdfDocument.SaveAs(OutputPath)

		' Update the property for the PDF URL
		PdfUrl = "/PdfFiles/HelloWorld.pdf"
		Changed(NameOf(PdfUrl))
	End Sub
End Class
$vbLabelText   $csharpLabel

通過新增新元件(例如 GeneratePdf.razor),建立 Blazor 元件並將其綁定到 ViewModel。

@page "/"

@using DotNetify
@using DotNetify.Blazor
@inject IDotNetifyService DotNetify

<PageTitle>Generate PDF</PageTitle>
<h3>Generate PDF</h3>

<button @onclick="GeneratePdf">Generate PDF</button>

@if (!string.IsNullOrEmpty(pdfUrl))
{
    <a href="@pdfUrl" target="_blank">Download PDF</a>
}

@code {
    private string pdfUrl;

    protected override async Task OnInitializedAsync()
    {
        var vm = await DotNetify.ConnectAsync<PdfViewModel>(this);
        pdfUrl = vm.PdfUrl;

        vm.PropertyChanged += (sender, args) =>
        {
            if (args.PropertyName == nameof(vm.PdfUrl))
            {
                pdfUrl = vm.PdfUrl;
                StateHasChanged();
            }
        };
    }

    private void GeneratePdf()
    {
        DotNetify.CallMethod("GeneratePdf");
    }
}

通過在 C# ASP.NET Core Blazor 應用程式中整合 DotNetify 和 IronPDF,即時資料處理和動態 PDF 生成成為可能。 設置開始於 Startup.cs 專案配置,其中註冊了 Razor Pages、Blazor Server、SignalR 和 DotNetify 的服務,以啟用伺服器端 Blazor 和即時功能。

在 PdfViewModel.cs 中,定義了 IronPDF 的 PDF 生成邏輯。 PDF 文件可以用幾行程式碼生成。 GeneratePdf 函式將 HTML 內容轉換為 PDF,並更新 PdfUrl 屬性,通知客戶端新文件的位置。 與 GeneratePdf.razor Blazor 元件的溝通由此 ViewModel 處理。

dotnetify .NET (開發者如何運作):圖 4

該元件透過 IDotNetifyService 連接到 PdfViewModel 並綁定其屬性,使客戶端能夠調用 GeneratePdf 函式並回應屬性變更。 當使用者點選"生成 PDF"按鈕時,ViewModel 的方法被調用,生成 PDF 並動態更新下載 URL。 透過這個配置,在融合 IronPDF 的強大文件生成能力與 DotNetify 的即時資料同步的情況下,網路應用程式提供了一個響應且吸引使用者的體驗。

dotnetify .NET (開發者如何運作):圖 5

結論

將 DotNetify 與 IronPDF 整合起來,在 C# ASP.NET Core Blazor 應用程式中結合了即時資料同步與動態 PDF 生成。 DotNetify 使得客戶端 Blazor 元件與伺服器端 ViewModel 之間的通信無縫化,導致互動和響應式的應用程式。 這補充以 IronPDF,提供了直接從伺服器端邏輯建立和修改 PDF 的強大工具。 這種強大結合允許開發應用程式建立和分發自定義文件,同時提供即時更新。

這種整合利用即時資料處理和文件生成技術來增強使用者體驗,不論是報告、開具發票還是任何與文件相關的任務。 通過遵循所列步驟,開發者可以有效地設定和使用這些工具,解鎖現代網路應用程式開發的新可能性。

透過 IronPDF 和Iron Software 開發工具,開發者能夠利用如 OCR、條碼掃描、PDF 生成等豐富功能,熱衷於探索其廣泛功能。 提供的與專案相關的授權替代選項有詳細的說明,允許開發者選擇最符合需求的模型。 所列的優勢有助於開發者提供及時、協同以及有效的解決方案,以面對多種挑戰。

常見問題

什麼是DotNetify,它如何運作?

DotNetify是一個以.NET和Blazor構建的開源框架,設計用於開發即時Web應用程式。它使用SignalR實現客戶端和伺服器之間的即時通訊,從而促成動態、互動式的Web應用程式的建立。

如何將即時Web應用程式與C#中的PDF生成整合?

透過結合DotNetify用於即時Web應用程式和IronPDF用於PDF生成,開發人員可以建立互動應用程式,根據即時資料輸入動態生成和分配PDF文件。

IronPDF為PDF文件處理提供了哪些功能?

IronPDF提供了用程式建立、編輯和轉換PDF文件的功能。它允許從HTML、CSS和JavaScript轉換為PDF,並支持各種PDF操作,非常適合生成報告和動態文件。

DotNetify如何提升即時應用程式開發?

DotNetify通過提供一個同步客戶端視圖與伺服器端資料的程式設計模型,提升了即時應用程式開發,這使得建立響應式和互動式的Web介面成為可能。它同時支持JavaScript和Blazor,為開發環境提供靈活性。

在DotNetify中使用SignalR有哪些好處?

DotNetify中的SignalR使客戶端伺服器之間的即時通訊成為可能,這對於建立互動和響應式的Web應用程式至關重要。這樣可以實現在應用程式內的即時更新和動態互動。

IronPDF如何協助在.NET應用程式中生成動態報告?

IronPDF可以通過將HTML內容,包括CSS和JavaScript,轉換為高品質的PDF文件來生成動態報告。這對於需要生成資料驅動的報告和發票的應用程式特別有用。

ViewModels在DotNetify中扮演什麼角色?

在DotNetify中,ViewModels用於處理客戶端與伺服器之間的資料同步。它們透過保持一致的資料流,促成具有響應式使用者介面的應用程式開發。

結合DotNetify和IronPDF如何提升使用者體驗?

結合DotNetify和IronPDF可以提升使用者體驗,因為這允許在單一應用程式中即時更新資料和動態生成PDF文件。這種整合實現了文件生成和分發的無縫銜接,增強了應用程式的功能。

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

Jacob Mellor是Iron Software的首席技術官,一位在C# PDF技術上開創先河的遠見工程師。作為Iron Software核心程式碼庫的原開發者,他從創立以來就一直在塑造公司的產品架構,與首席執行官Cameron Rimington一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。

Jacob擁有曼徹斯特大學的土木工程一等榮譽學士學位(BEng),於1998-2001年之間獲得。在1999年於倫敦創辦他的第一家軟體公司並於2005年建立了他的第一批.NET元組件後,他專注於解決Microsoft生態系統中的複雜問題。

他的旗艦IronPDF和Iron Suite .NET程式庫在全球獲得了超過3000萬次NuGet安裝依據,他的基礎程式碼基繼續支援著世界各地開發者使用的工具。擁有25年的商業經驗和41年的程式設計專業知識,他仍專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話