Przejdź do treści stopki
POMOC .NET

PostSharp C# (jak to działa dla programistów)

W dynamicznym świecie tworzenia oprogramowania, zorganizowanie i produktywność bazy kodu są kluczowe. Programiści często napotykają wyzwania związane z zarządzaniem przekrojowymi zagadnieniami, takimi jak zarządzanie transakcjami, bezpieczeństwo i logowanie, które mogą skomplikować logikę aplikacji. W celu zwiększenia modularyzacji i łatwości utrzymania kodu, AOP (Programowanie Zorientowane Aspektowo) oferuje rozwiązanie poprzez izolację tych zagadnień od logiki biznesowej. AOP w .NET jest efektywnie wdrażane za pomocą PostSharp, wiodącego frameworka, oraz tworzenie i manipulacja PDF za pomocą IronPDF, potężnej biblioteki do obsługi PDF w aplikacjach .NET. Użycie PostSharp i IronPDF razem może uprościć tworzenie .NET, szczególnie przy zarządzaniu działaniami związanymi z PDF, co sugeruje obniżenie kosztów rozwoju. Ten artykuł bada tę możliwość.

PostSharp to znany framework, który upraszcza programowanie w .NET, oferując programowanie zorientowane aspektowo (AOP). Umożliwia programistom tworzenie kodu, który jest jaśniejszy i łatwiejszy do utrzymania, poprzez oddzielenie przekrojowych zagadnień od rdzennej logiki aplikacji. Przekrojowe zagadnienia to cechy programu, które wpływają na inne cechy; zazwyczaj obejmują one monitorowanie wydajności, obsługę błędów, logowanie i bezpieczeństwo.

PostSharp C# (Jak działa dla programistów): Rysunek 1 - Strona główna PostSharp C#

Programowanie Zorientowane Aspektowo (AOP)

Celem paradygmatu programowania AOP jest tworzenie bardziej modularnego kodu przez rozdzielenie zagadnień związanych z różnymi obszarami. Jest to dodatek do Programowania Zorientowanego Obiektowo (OOP), ponieważ pozwala na dodawanie dodatkowych funkcji do istniejącego kodu bez bezpośrednich zmian. Aspekty, które są modularnymi elementami kodu zawierającymi zachowania wpływające na wiele klas lub metod, są używane do tego celu—znane jako Aspekty PostSharp.

Dostosowywalność

Aby zapewnić elastyczność i adaptację do celów indywidualnych projektów, programiści mogą konstruować niestandardowe elementy odpowiadające wymaganiom aplikacji.

Optymalizacja wydajności

W przeciwieństwie do tradycyjnego przechwytywania w czasie wykonywania, PostSharp minimalizuje obciążenie w czasie wykonywania poprzez implementację funkcji w kodzie źródłowym Intermediate Language (IL) podczas kompilacji, maksymalizując efektywność.

Diagnostyka PostSharp

Komponent PostSharp, który pomaga programistom znajdować i naprawiać wąskie gardła wydajności, błędy i nieefektywności to PostSharp Diagnostics, oferujący wgląd w zachowanie i wydajność aplikacji.

Biblioteki aspektowe

PostSharp dostarcza dodatkowe funkcje, takie jak zaawansowana diagnostyka i strukturalne logowanie za pomocą bibliotek i rozszerzeń (np. PostSharp.Patterns.Diagnostics).

Obsługa wielu platform

PostSharp jest kompatybilny z różnymi platformami, pozwalając programistom na użycie jego funkcji w projektach skierowanych na systemy operacyjne Linux, macOS X i Windows.

Kontrakty kody

Poprzez integrację z kontraktami kody, PostSharp poprawia jakość i niezawodność kodu, pozwalając programistom definiować warunki wstępne, warunki końcowe i inwarianty dla metod.

Wsparcie dla .NET Core i .NET Framework

PostSharp jest kompatybilny z różnymi typami projektów i frameworkami, wspierając zarówno .NET Core, jak i .NET Framework.

Create and configure PostSharp C

Zanim będziesz mógł używać PostSharp w projekcie C#, musisz go zainstalować i skonfigurować w ramach rozwiązania Visual Studio. Poniższe kroki pomogą Ci ustanowić i skonfigurować PostSharp w nowym lub istniejącym projekcie C#.

Utwórz nowy projekt Visual Studio

Tworzenie projektu konsolowego w Visual Studio jest proste. Wykonaj poniższe kroki, aby rozpocząć aplikację konsolową w Srodowisko Visual Studio:

Upewnij się, że Visual Studio jest zainstalowane na Twoim komputerze.

Rozpocznij nowy projekt

Wybierz "Nowy" z menu Plik, następnie wybierz "Projekt".

PostSharp C# (How It Works For Developers): Figure 2 - Click New, then File, then Project

Szablon "Aplikacja konsolowa" lub "Aplikacja konsolowa (.NET Core)" jest dostępny do wyboru z listy odniesień szablonów projektowych.

Wpisz nazwę projektu w sekcji "Nazwa".

PostSharp C# (Jak działa dla programistów): Rysunek 3 - Podaj nazwę i lokalizację

Wybierz lokalizację do przechowywania projektu.

Kliknij "Utwórz", aby uruchomić projekt aplikacji konsolowej.

PostSharp C# (How It Works For Developers): Figure 4 - Click Create

Instalacja PostSharp

PostSharp można zainstalować za pomocą Package Manager Console:

Install-Package PostSharp

Tworzenie aspektu PostSharp

Aby zdefiniować swój aspekt, dodaj do projektu nowy plik klasy C#. Dziedzicząc z jednego z OnMethodBoundaryAspect, MethodInterceptionAspect lub innych odpowiednich bazowych klas aspektowych, możesz zaimplementować swój niestandardowy atrybut lub aspekt. Oto przykład podstawowego OnMethodBoundaryAspect aspektu logowania:

using PostSharp.Aspects;
using System;

// Define a logging aspect using OnMethodBoundaryAspect
[Serializable]
public class LoggingAspect : OnMethodBoundaryAspect
{
    // Executed before the method is invoked
    public override void OnEntry(MethodExecutionArgs args)
    {
        Console.WriteLine($"Entering method {args.Method.Name}.");
    }

    // Executed after the method has completed execution, both on success and failure
    public override void OnExit(MethodExecutionArgs args)
    {
        Console.WriteLine($"Exiting method {args.Method.Name}.");
    }

    // Executed when the method throws an exception
    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine($"Exception in method {args.Method.Name}: {args.Exception.Message}");
    }
}
using PostSharp.Aspects;
using System;

// Define a logging aspect using OnMethodBoundaryAspect
[Serializable]
public class LoggingAspect : OnMethodBoundaryAspect
{
    // Executed before the method is invoked
    public override void OnEntry(MethodExecutionArgs args)
    {
        Console.WriteLine($"Entering method {args.Method.Name}.");
    }

    // Executed after the method has completed execution, both on success and failure
    public override void OnExit(MethodExecutionArgs args)
    {
        Console.WriteLine($"Exiting method {args.Method.Name}.");
    }

    // Executed when the method throws an exception
    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine($"Exception in method {args.Method.Name}: {args.Exception.Message}");
    }
}
Imports PostSharp.Aspects
Imports System

' Define a logging aspect using OnMethodBoundaryAspect
<Serializable>
Public Class LoggingAspect
	Inherits OnMethodBoundaryAspect

	' Executed before the method is invoked
	Public Overrides Sub OnEntry(ByVal args As MethodExecutionArgs)
		Console.WriteLine($"Entering method {args.Method.Name}.")
	End Sub

	' Executed after the method has completed execution, both on success and failure
	Public Overrides Sub OnExit(ByVal args As MethodExecutionArgs)
		Console.WriteLine($"Exiting method {args.Method.Name}.")
	End Sub

	' Executed when the method throws an exception
	Public Overrides Sub OnException(ByVal args As MethodExecutionArgs)
		Console.WriteLine($"Exception in method {args.Method.Name}: {args.Exception.Message}")
	End Sub
End Class
$vbLabelText   $csharpLabel

Zmień zachowanie aspektu, aby odpowiadało Twoim potrzebom; na przykład loguj parametry metod lub wartości zwracane.

Zastosowanie aspektu

Aby zastosować nowo zdefiniowany aspekt, użyj go w metodach lub klasach, w których chcesz angażować zachowanie przekrojowe. Użyj atrybutu [LoggingAspect] na kodzie logowania w docelowej metodzie lub klasie.

public class ExampleService
{
    [LoggingAspect]
    public void DoSomething()
    {
        Console.WriteLine("Doing something...");
    }
}
public class ExampleService
{
    [LoggingAspect]
    public void DoSomething()
    {
        Console.WriteLine("Doing something...");
    }
}
Imports System

Public Class ExampleService
    <LoggingAspect>
    Public Sub DoSomething()
        Console.WriteLine("Doing something...")
    End Sub
End Class
$vbLabelText   $csharpLabel

Konfiguracja PostSharp (Opcjonalnie)

Aby dostosować funkcjonalność i ułatwić integrację z innymi programami, PostSharp oferuje szereg opcji konfiguracji. Zazwyczaj konfiguracja odbywa się za pomocą atrybutów, plików XML lub programowo.

Konfiguracja logowania: Użyj atrybutów lub konfiguracji XML, aby określić poziomy logów, cele logowania i inne parametry logowania.

Optymalizacja wydajności: Zmień parametry tkania i kompilacji PostSharp, aby maksymalizować efektywność.

PostSharp C# (Jak działa dla programistów): Rysunek 5 - Przykład wyjścia konsolowego

Pierwsze kroki

Aby użyć programowania zorientowanego aspektowo (AOP) do tworzenia i manipulacji PDF, zintegruj PostSharp i IronPDF w swoim projekcie w C#. Postępuj zgodnie z instrukcjami w tym przewodniku, aby efektywnie skonfigurować i używać PostSharp z IronPDF.

Pierwsze kroki

W projekcie C#, integracja NServiceBus z RabbitMQ i IronPDF polega na konfigurowaniu wiadomości między NServiceBus a RabbitMQ oraz używaniu IronPDF do tworzenia PDFów. Oto szczegółowy przewodnik, który pomoże Ci rozpocząć:

Czym jest IronPDF - Biblioteka PDF w .NET?

IronPDF to biblioteka .NET używana do tworzenia, czytania, edytowania i konwertowania plików PDF. Dostarcza programistom solidne i przyjazne dla użytkownika narzędzie do pracy z plikami PDF w aplikacjach C# lub VB.NET. Poniżej znajduje się szczegółowy opis funkcji i możliwości IronPDF:

PostSharp C# (Jak działa dla programistów): Rysunek 6 - IronPDF: Strona główna biblioteki PDF w C#

Funkcje IronPDF

Generowanie PDF z HTML Konwertuj HTML, CSS i JavaScript do formatu PDF. Obsługuje nowoczesne standardy sieciowe, takie jak zapytania medialne i projektowanie responsywne. Przydatne do tworzenia rachunków PDF, raportów i dokumentów ze zmiennym stylem przy użyciu HTML i CSS.

Edytowanie PDF Możesz dodawać tekst, obrazy i inne treści do istniejących PDFów. Wyodrębnij tekst i obrazy z plików PDF. Łącz wiele PDFów w jeden plik. Rozdzielaj PDFy, aby tworzyć kilka dokumentów. Dodaj nagłówki, stopki, adnotacje i znaki wodne.

Konwersja PDF Konwertuj różne formaty plików, w tym Word, Excel i obrazy, na PDF oraz konwertuj PDFy na obrazy (PNG, JPEG, itp.).

Wydajność i niezawodność Zaprojektowane pod kątem wysokiej wydajności i niezawodności w środowiskach przemysłowych. Efektywnie obsługuje duże dokumenty.

Zainstaluj IronPDF

Zainstaluj pakiet IronPDF, aby uzyskać narzędzia potrzebne do pracy z PDFami w aplikacjach .NET:

Install-Package IronPdf

Tworzenie aspektu PostSharp do generowania PDF

Teraz stwórzmy funkcję PostSharp, która wykorzystuje IronPDF do zarządzania generowaniem PDF.

Zdefiniowanie aspektu

W swoim projekcie dodaj nowy plik klasy C# o nazwie PdfGenerationAspect.cs (lub odpowiednią nazwę). Dziedzicząc z OnMethodBoundaryAspect, możesz zaimplementować aspekt, aby wykonać kod przed i po wywołaniu metody:

using PostSharp.Aspects;
using IronPdf;
using System;

// Define a PDF generation aspect using OnMethodBoundaryAspect
[Serializable]
public class PdfGenerationAspect : OnMethodBoundaryAspect
{
    // Executed before the method invocation
    public override void OnEntry(MethodExecutionArgs args)
    {
        Console.WriteLine($"Generating PDF for method {args.Method.Name}.");
    }

    // Executed upon the successful completion of the method
    public override void OnSuccess(MethodExecutionArgs args)
    {
        var htmlContent = args.Arguments.GetArgument(0) as string;
        var outputPath = args.Arguments.GetArgument(1) as string;

        // Create an instance of HtmlToPdf class
        var Renderer = new HtmlToPdf();

        // Convert HTML content to PDF
        var pdf = Renderer.RenderHtmlAsPdf(htmlContent);

        // Save the generated PDF to the specified path
        pdf.SaveAs(outputPath);

        Console.WriteLine($"PDF generated successfully at {outputPath}.");
    }

    // Executed when the method throws an exception
    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine($"Exception occurred in method {args.Method.Name}: {args.Exception.Message}");
    }
}
using PostSharp.Aspects;
using IronPdf;
using System;

// Define a PDF generation aspect using OnMethodBoundaryAspect
[Serializable]
public class PdfGenerationAspect : OnMethodBoundaryAspect
{
    // Executed before the method invocation
    public override void OnEntry(MethodExecutionArgs args)
    {
        Console.WriteLine($"Generating PDF for method {args.Method.Name}.");
    }

    // Executed upon the successful completion of the method
    public override void OnSuccess(MethodExecutionArgs args)
    {
        var htmlContent = args.Arguments.GetArgument(0) as string;
        var outputPath = args.Arguments.GetArgument(1) as string;

        // Create an instance of HtmlToPdf class
        var Renderer = new HtmlToPdf();

        // Convert HTML content to PDF
        var pdf = Renderer.RenderHtmlAsPdf(htmlContent);

        // Save the generated PDF to the specified path
        pdf.SaveAs(outputPath);

        Console.WriteLine($"PDF generated successfully at {outputPath}.");
    }

    // Executed when the method throws an exception
    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine($"Exception occurred in method {args.Method.Name}: {args.Exception.Message}");
    }
}
Imports PostSharp.Aspects
Imports IronPdf
Imports System

' Define a PDF generation aspect using OnMethodBoundaryAspect
<Serializable>
Public Class PdfGenerationAspect
	Inherits OnMethodBoundaryAspect

	' Executed before the method invocation
	Public Overrides Sub OnEntry(ByVal args As MethodExecutionArgs)
		Console.WriteLine($"Generating PDF for method {args.Method.Name}.")
	End Sub

	' Executed upon the successful completion of the method
	Public Overrides Sub OnSuccess(ByVal args As MethodExecutionArgs)
		Dim htmlContent = TryCast(args.Arguments.GetArgument(0), String)
		Dim outputPath = TryCast(args.Arguments.GetArgument(1), String)

		' Create an instance of HtmlToPdf class
		Dim Renderer = New HtmlToPdf()

		' Convert HTML content to PDF
		Dim pdf = Renderer.RenderHtmlAsPdf(htmlContent)

		' Save the generated PDF to the specified path
		pdf.SaveAs(outputPath)

		Console.WriteLine($"PDF generated successfully at {outputPath}.")
	End Sub

	' Executed when the method throws an exception
	Public Overrides Sub OnException(ByVal args As MethodExecutionArgs)
		Console.WriteLine($"Exception occurred in method {args.Method.Name}: {args.Exception.Message}")
	End Sub
End Class
$vbLabelText   $csharpLabel

Ten aspekt obsługuje pomyślne tworzenie PDFów (OnSuccess), loguje rozpoczęcie tworzenia PDFa (OnEntry), i loguje wszelkie wyjątki (OnException).

Dodaj PdfGenerationAspect aspekt do funkcji, która używa IronPDF do tworzenia PDFów. Zdefiniuj klasę z metodą do generowania PDFów:

public class PdfService
{
    [PdfGenerationAspect] // Apply the PdfGenerationAspect here
    public void GeneratePdf(string htmlContent, string outputPath)
    {
        // Create an instance of HtmlToPdf class
        var Renderer = new HtmlToPdf();

        // Convert HTML content to PDF
        var pdf = Renderer.RenderHtmlAsPdf(htmlContent);

        // Save the generated PDF to the specified path
        pdf.SaveAs(outputPath);
    }
}
public class PdfService
{
    [PdfGenerationAspect] // Apply the PdfGenerationAspect here
    public void GeneratePdf(string htmlContent, string outputPath)
    {
        // Create an instance of HtmlToPdf class
        var Renderer = new HtmlToPdf();

        // Convert HTML content to PDF
        var pdf = Renderer.RenderHtmlAsPdf(htmlContent);

        // Save the generated PDF to the specified path
        pdf.SaveAs(outputPath);
    }
}
Public Class PdfService
	<PdfGenerationAspect>
	Public Sub GeneratePdf(ByVal htmlContent As String, ByVal outputPath As String)
		' Create an instance of HtmlToPdf class
		Dim Renderer = New HtmlToPdf()

		' Convert HTML content to PDF
		Dim pdf = Renderer.RenderHtmlAsPdf(htmlContent)

		' Save the generated PDF to the specified path
		pdf.SaveAs(outputPath)
	End Sub
End Class
$vbLabelText   $csharpLabel

Upewnij się, że lokalizacja, z której piszesz lub zamierzasz wywoływać metodę HTML do PDF za pomocą najlepszych praktyk IronPDF, ma dostęp do klasy PdfService.

PostSharp C# (Jak działa dla programistów): Rysunek 7 - Przykład wyjścia konsolowego

Teraz, twórz PDFy z zastosowanym aspektem, używając klasy PdfService. Utwórz instancję PdfService w swojej głównej aplikacji lub innej klasie, i użyj funkcji GeneratePdf z poprawną zawartością HTML i ścieżką wyjścia. Klasa aspektowa (PdfGenerationAspect) obsłuży wszelkie wyjątki, które pojawią się podczas generowania PDF, zloguje odpowiednie wiadomości i przechwyci wywołania metod, gdy zostaną wykonane.

class Program
{
    static void Main(string[] args)
    {
        // Create an instance of PdfService
        var pdfService = new PdfService();

        // Define HTML content and output PDF path
        string htmlContent = "<h1>Hello World</h1>";
        string outputPath = "hello_world.pdf";

        // Invoke PDF generation
        pdfService.GeneratePdf(htmlContent, outputPath);
    }
}
class Program
{
    static void Main(string[] args)
    {
        // Create an instance of PdfService
        var pdfService = new PdfService();

        // Define HTML content and output PDF path
        string htmlContent = "<h1>Hello World</h1>";
        string outputPath = "hello_world.pdf";

        // Invoke PDF generation
        pdfService.GeneratePdf(htmlContent, outputPath);
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Create an instance of PdfService
		Dim pdfService As New PdfService()

		' Define HTML content and output PDF path
		Dim htmlContent As String = "<h1>Hello World</h1>"
		Dim outputPath As String = "hello_world.pdf"

		' Invoke PDF generation
		pdfService.GeneratePdf(htmlContent, outputPath)
	End Sub
End Class
$vbLabelText   $csharpLabel

PostSharp C# (Jak działa dla programistów): Rysunek 8 - Wyjście PDF z IronPDF

Wnioski

Podsumowując, połączenie PostSharp i IronPDF w aplikacjach C# tworzy potężną synergię, zwiększając możliwość utrzymania kodu oraz zdolności generowania i manipulacji PDF. PostSharp upraszcza programowanie zorientowane aspektowo (AOP), pozwalając programistom na enkapsulację przekrojowych zagadnień, takich jak monitorowanie wydajności, obsługa wyjątków i logowanie w wielokrotnego użytku aspekty. Poprzez oddzielenie istotnej logiki biznesowej od powtarzającego się kodu szkieletowego, takie podejście sprzyja prostszemu, bardziej modułowemu i czystszemu kodowi.

Natomiast, IronPDF oferuje solidne możliwości do generowania, modyfikacji i pracy z dokumentami PDF w aplikacjach .NET. Programiści mogą zwiększyć czytelność kodu, zmniejszyć liczbę błędów i przyspieszyć operacje związane z PDF łącząc narzędzia do tworzenia PDF IronPDF z możliwościami AOP PostSharp.

Na koniec, możesz pracować z kodami kreskowymi, tworzyć PDFy, prowadzić OCR, i integrować z Excelem, dodając IronPDF i Iron Software do swojego zestawu narzędzi do programowania w .NET. Z ceną początkową $799, odkryj opcje licencjonowania IronPDF, łącząc jego funkcje z wydajnością, kompatybilnością i łatwością użycia rozbudowanego zestawu funkcji Iron Software, aby oferować więcej aplikacji online i możliwości oraz bardziej efektywne tworzenie.

Programiści mogą z pewnością wybrać najlepszy model, jeśli istnieją jasne opcje licencyjne dostosowane do specyficznych potrzeb projektu. Te zalety umożliwiają programistom efektywne i przejrzyste radzenie sobie z różnorodnymi wyzwaniami.

Często Zadawane Pytania

Jak mogę wykorzystać programowanie zorientowane aspektowo w .NET z PostSharp?

PostSharp pozwala na wdrożenie programowania zorientowanego na aspekty (AOP) w środowisku .NET poprzez oddzielenie zagadnień przekrojowych, takich jak logowanie, bezpieczeństwo i zarządzanie transakcjami, od podstawowej logiki biznesowej. Odbywa się to za pomocą aspektów, takich jak OnMethodBoundaryAspect, które można dostosować do obsługi zadań wykonywanych przed i po wykonaniu metody.

Jakie korzyści daje integracja PostSharp z IronPDF?

Integracja PostSharp z IronPDF zwiększa łatwość utrzymania kodu i wydajność, umożliwiając programistom efektywne wykonywanie operacji związanych z plikami PDF. Funkcje AOP PostSharp upraszczają zarządzanie problemami przekrojowymi, a IronPDF oferuje solidne funkcje tworzenia, modyfikacji i konwersji plików PDF.

Jak przekonwertować HTML na PDF za pomocą biblioteki .NET?

Możesz użyć IronPDF do konwersji HTML na PDF w .NET, korzystając z metody RenderHtmlAsPdf dla ciągów HTML lub RenderHtmlFileAsPdf dla plików HTML. Ten proces konwersji jest usprawniony, oferując wysoką wydajność i niezawodność.

W jaki sposób PostSharp może pomóc w diagnozowaniu problemów z wydajnością mojej aplikacji?

PostSharp Diagnostics to potężna funkcja, która pomaga programistom w identyfikowaniu wąskich gardeł wydajności, błędów i nieefektywności poprzez zapewnienie wglądu w zachowanie i wydajność aplikacji. Pomaga to zoptymalizować wydajność aplikacji i poprawić jakość kodu.

Jakie kroki należy wykonać, aby skonfigurować projekt Visual Studio z wykorzystaniem PostSharp?

Aby skonfigurować PostSharp w projekcie Visual Studio, należy zainstalować go za pomocą konsoli Package Manager Console. Po instalacji można tworzyć niestandardowe aspekty poprzez dziedziczenie z klas bazowych, takich jak OnMethodBoundaryAspect, w celu zarządzania aspektami wykonywania metod, takimi jak logowanie i obsługa wyjątków.

W jaki sposób PostSharp zwiększa modułowość aplikacji .NET?

PostSharp zwiększa modułowość, umożliwiając programistom enkapsulację zagadnień przekrojowych w oddzielnych modułach, zwanych aspektami. Takie rozdzielenie skutkuje czystszym i łatwiejszym w utrzymaniu kodem, ponieważ podstawowa logika biznesowa nie jest przeplatana kodem pomocniczym, takim jak logowanie czy zabezpieczenia.

Czy IronPDF może być używany do edycji plików PDF w aplikacjach .NET?

Tak, IronPDF oferuje szeroki zakres funkcji do edycji plików PDF w aplikacjach .NET, w tym scalanie, dzielenie i modyfikowanie dokumentów PDF. Funkcje te pozwalają programistom efektywnie zarządzać treścią plików PDF w ramach ich rozwiązań programowych.

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Dyrektor ds. technologii

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczą...

Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie