Flurl C#(開発者向けの仕組み)
C#開発に関して言えば、強力なライブラリを組み込むことで、出力と容量を大幅に向上させることができます。 相互にうまく機能する2つのライブラリはFlurlとIronPDFです。これらはプログラマーにPDFを作成し、オンラインAPIと対話するための強力なツールをそれぞれ提供します。
Flurlは流動的で表現力豊かな構文を提供し、C#でのHTTPリクエスト、API、およびそのAPIエンドポイントの操作を簡単にします。 HTTPリクエストの送信、応答の受信、クエリパラメーターやヘッダーの管理は、そのほんの一部を簡素化します。 開発者はFlurlを使用して、認証を管理し、JSONをシリアライズおよびデシリアライズし、わかりやすく整然としたコードを書きながら、迅速かつ効果的にWeb APIを消費できます。
開発者は、Flurlの使いやすさと汎用性をIronPDFと組み合わせることで、Web APIと連携してデータを取得し、それを簡単にIronPDFに統合することで、詳細かつ準備されたPDFドキュメントを作成できます。 この統合により、プログラマーは、オンラインサービスから取得したリアルタイムデータを使用してドキュメントを自動的に作成することで、生産性とユーザーエクスペリエンスを向上させる複雑なアプリケーションを設計できます。
この紹介では、C#プログラムでFlurlとIronPDFを使用して組み合わせる方法を探り、現代のソフトウェア開発においてそれらの利点と相乗効果の可能性を強調します。
Flurl C#とは何ですか?
Flurlは、HTTPリクエストを管理し、オンラインAPIと通信するための強力でユーザーフレンドリーなC#ライブラリです。流動的でチェーン可能な構文を提供し、コードの可読性と保守性を向上させ、RESTful APIとのやり取りの複雑さを軽減します。開発者はFlurlを使用して、HTTPリクエストを簡単に作成して送信し、応答を理解しやすい方法で処理し、クエリパラメーター、ヘッダー、およびペイロードを管理することができます。
Flurlの最も顕著な特徴の1つは、URLの動的な生成を管理する能力であり、これにより、実行時の状況に応じてURLを作成および変更するのが簡単であり、スタンドアロンのURLビルダーとしても使用可能です。 GET、POST、PUT、DELETEなどの一般的なHTTP機能をサポートし、JSONデータのシリアル化およびデシリアル化の管理をサポートしているため、さまざまなAPI統合シナリオに適応可能です。さらに、Flurlはフォームデータとクエリパラメーターの管理に関する組み込み機能を備えています。
流暢なインターフェース
Flurlが提供する流暢でチェーン可能な構文は、プログラムの可読性と保守性を向上させます。 開発者はシンプルで表現力豊かなHTTPリクエストを作成し、URL、クエリパラメータ、ヘッダー、およびペイロードを操作することができます。
HTTPメソッドのサポート
GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONSを含むすべての標準HTTPメソッドがサポートされています。 この包括的なサポートアプローチのおかげで、開発者はWeb API作業時にさまざまなタスクを実行できます。
クエリパラメータの処理
FlurlはURL内のクエリパラメーターの変更、追加、削除の簡単な方法を提供します。 ユーザー入力や実行時の状況に基づいて動的なURLを作成するのが簡単になります。
JSONサポート
FlurlはJSONデータ処理をネイティブでサポートしています。 JSON応答をC#オブジェクトに簡単にデシリアライズし、オブジェクトをリクエストペイロード用にJSONにシリアル化できます。 これにより、JSONベースのAPIの利用がシンプルで簡単になります。
フォームデータおよびマルチパートサポート
マルチパートリクエストとフォームデータの管理を容易にします。 Flurlは、開発者がHTTPリクエストにマルチパート/フォームデータペイロードやフォームエンコードデータを簡単に含めることを可能にします。
エラーハンドリングとリトライポリシー
Flurlは、すべてのHTTPコールに対してリトライポリシーの定義とエラーハンドリング機能を提供します。 開発者は、特定のエラーハンドリングロジックやリトライ手法を定義することで、APIコールとやり取りの回復力と信頼性を高めることができます。 これにより、応答における匿名オブジェクトエラーが防止され、保護されます。
認証
OAuth、カスタム認証スキーム、基本認証、APIキーなどの人気のあるWeb API認証方法をサポートしています。 これにより、認証が必要なAPIとの安全な通信が確保されます。
テストサポート
HTTP関連のロジックを再利用可能なコンポーネントに分離し、明確な関心の分離を提供することで、Flurlはテスト可能性を促進します。 これにより、実際のネットワークコールなしでAPIのやり取りをテストするための単体テストの作成が容易になります。
構成の柔軟性
HTTPクライアントとリクエストパラメーターの構成の柔軟性を提供します。 開発者は、特定のアプリケーションやAPI制限のニーズに合わせて、クライアントの動作、タイムアウト、エラーレスポンスの量、ヘッダー、その他の設定を変更できます。
拡張性
プラグインのフレームワークにより、Flurlは非常に拡張性があります。 開発者は独自の拡張機能を構築したり、プラットフォームの機能を増強するためのサードパーティのプラグインを統合したりできます。
Create and configure Flurl C#
C#プロジェクトでFlurlを構築して構成するための手順は次のとおりです:
新しいVisual Studioプロジェクトの作成
Visual Studioを使用してコンソールプロジェクトを簡単に作成できます。 Visual Studio環境でコンソールアプリケーションを開始するために、次の簡単な手順に従います:
使用を試みる前に、あなたのコンピュータにVisual Studioがインストールされていることを確認してください。
新しいプロジェクトを開始する
ファイル、プロジェクト、次に新しいオプションを選択します。
Flurl C# (How It Works For Developers): 図1 - 新規オプションをクリック
以下のプロジェクトテンプレート参照リストから"Console App"または"Console App (.NET Core)"テンプレートを選択できます。
プロジェクトに名前を付けるために、"名前"フォームに入力してください。
Flurl C# (How It Works For Developers): 図2 - 名前と場所を指定
プロジェクトを保存する場所を選択します。
"作成"をクリックすると、コンソールアプリケーションプロジェクトが開きます。

Flurl.Http パッケージをインストールする
最初のステップは、NuGet パッケージ マネージャー コンソールまたはVisual StudioのNuGet パッケージ マネージャーを使用して、Flurl.Httpパッケージをインストールすることです。
FlurlClient 構成を作成する
FlurlはFlurlClientクラスを提供しており、URLビルダーだけを使用することで、すべてのHTTPリクエストのデフォルトパラメーターを確立することができます。 これはオプションですが、有益なステップであり、ベースURLやデフォルトヘッダーを設定することで達成できます。
using Flurl;
using Flurl.Http;
// Configure a FlurlClient instance with base URL and headers
FlurlClient flurlClient = new FlurlClient("https://api.example.com/");
flurlClient.WithHeader("Authorization", "Bearer YourAccessTokenHere");Imports Flurl
Imports Flurl.Http
' Configure a FlurlClient instance with base URL and headers
Private flurlClient As New FlurlClient("https://api.example.com/")
flurlClient.WithHeader("Authorization", "Bearer YourAccessTokenHere")Imports Flurl
Imports Flurl.Http
' Configure a FlurlClient instance with base URL and headers
Private flurlClient As New FlurlClient("https://api.example.com/")
flurlClient.WithHeader("Authorization", "Bearer YourAccessTokenHere")HTTP リクエストを行う
Flurlの流暢なURLを使用してHTTPリクエストを行うことができます。
var response = await "http://localhost:5013/users".GetAsync();
Console.WriteLine(response.ToString());
if (response.ResponseMessage.IsSuccessStatusCode)
{
var result = await response.ResponseMessage.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
else
{
Console.WriteLine($"Error: {response.StatusCode}");
}var response = await "http://localhost:5013/users".GetAsync();
Console.WriteLine(response.ToString());
if (response.ResponseMessage.IsSuccessStatusCode)
{
var result = await response.ResponseMessage.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
else
{
Console.WriteLine($"Error: {response.StatusCode}");
}Dim response = await "http://localhost:5013/users".GetAsync()
Console.WriteLine(response.ToString())
If response.ResponseMessage.IsSuccessStatusCode Then
Dim result = Await response.ResponseMessage.Content.ReadAsStringAsync()
Console.WriteLine(result)
Else
Console.WriteLine($"Error: {response.StatusCode}")
End IfDim response = await "http://localhost:5013/users".GetAsync()
Console.WriteLine(response.ToString())
If response.ResponseMessage.IsSuccessStatusCode Then
Dim result = Await response.ResponseMessage.Content.ReadAsStringAsync()
Console.WriteLine(result)
Else
Console.WriteLine($"Error: {response.StatusCode}")
End IfFlurl C# (How It Works For Developers): 図4 - コンソールの出力例
応答を処理する
FlurlのHttpResponseMessageExtensionsは、取得フォーマット(JSON、文字列など)に基づいて応答コンテンツを管理するための拡張メソッド、たとえばReceiveJsonやReceiveStringを提供します。
// Handling JSON response
var responseObject = await "https://api.example.com/resource"
.WithClient(flurlClient)
.GetJsonAsync<ResponseType>();
// Assuming ResponseType is a class representing the expected JSON structure
Console.WriteLine($"Response: {responseObject.Property}");// Handling JSON response
var responseObject = await "https://api.example.com/resource"
.WithClient(flurlClient)
.GetJsonAsync<ResponseType>();
// Assuming ResponseType is a class representing the expected JSON structure
Console.WriteLine($"Response: {responseObject.Property}");Imports System
Imports Flurl.Http
' Handling JSON response
Dim responseObject As ResponseType = Await "https://api.example.com/resource" _
.WithClient(flurlClient) _
.GetJsonAsync(Of ResponseType)()
' Assuming ResponseType is a class representing the expected JSON structure
Console.WriteLine($"Response: {responseObject.Property}")Imports System
Imports Flurl.Http
' Handling JSON response
Dim responseObject As ResponseType = Await "https://api.example.com/resource" _
.WithClient(flurlClient) _
.GetJsonAsync(Of ResponseType)()
' Assuming ResponseType is a class representing the expected JSON structure
Console.WriteLine($"Response: {responseObject.Property}")追加の設定
-
クエリパラメータ: クエリパラメータを追加するには、
.SetQueryParams()メソッドを使用します。 効率のために、各リクエストが同じHttpClientインスタンスを使用して実行されるようにしてください。 -
タイムアウト: 例えば、
.WithTimeout(TimeSpan.FromSeconds(30))を使用してタイムアウトを設定できます。 -
エラーハンドリング: 特定のエラーシナリオを処理するには、
.OnError()を使用します。
開始方法
リモートAPIからデータを取得し、そのデータを使用してPDFドキュメントを作成する必要がある場合、C#プロジェクトでFlurlとIronPDFを統合することが役立ちます。 FlurlとIronPDFの使用を始めるには、次の手順に従ってください:
IronPDFとは?
IronPDFというC#プログラムでPDFドキュメントを作成、読み取り、修正できる機能豊富な.NETライブラリが存在します。 このツールにより、開発者はHTML、CSS、JavaScriptコンテンツから印刷可能で高品質なPDFを迅速に生成できます。 いくつかの基本的な機能には、透かしの追加、ヘッダーとフッターの作成、PDFの分割と結合、HTMLのPDFへの変換機能が含まれます。 IronPDFは.NET Frameworkと.NET Coreをサポートしており、さまざまなアプリケーションに便利です。
PDFは簡単に統合され、詳細なドキュメントが豊富にあるため、開発者はそれらを簡単にアプリケーションに利用できます。 IronPDFは、複雑なレイアウトとスタイリングを効率的に処理することで、生成されたPDFがソースHTMLコンテンツに非常に類似することを保証します。
IronPDFはウェブページ、URL、HTMLを元のコンテンツそっくりに見える高品質なPDFに変換するのを非常に簡単にします。 これはオンラインレポートや請求書のPDFを作成するのに最適です。 HTMLをPDFに変換する方法を探しているなら、IronPDFがカバーします!
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
// 1. Convert HTML String to PDF
var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");
// 2. Convert HTML File to PDF
var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");
// 3. Convert URL to PDF
var url = "http://ironpdf.com"; // Specify the URL
var pdfFromUrl = renderer.RenderUrlAsPdf(url);
pdfFromUrl.SaveAs("URLToPDF.pdf");
}
}using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
// 1. Convert HTML String to PDF
var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");
// 2. Convert HTML File to PDF
var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");
// 3. Convert URL to PDF
var url = "http://ironpdf.com"; // Specify the URL
var pdfFromUrl = renderer.RenderUrlAsPdf(url);
pdfFromUrl.SaveAs("URLToPDF.pdf");
}
}Imports IronPdf
Friend Class Program
Shared Sub Main(ByVal args() As String)
Dim renderer = New ChromePdfRenderer()
' 1. Convert HTML String to PDF
Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")
' 2. Convert HTML File to PDF
Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")
' 3. Convert URL to PDF
Dim url = "http://ironpdf.com" ' Specify the URL
Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
pdfFromUrl.SaveAs("URLToPDF.pdf")
End Sub
End ClassImports IronPdf
Friend Class Program
Shared Sub Main(ByVal args() As String)
Dim renderer = New ChromePdfRenderer()
' 1. Convert HTML String to PDF
Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")
' 2. Convert HTML File to PDF
Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")
' 3. Convert URL to PDF
Dim url = "http://ironpdf.com" ' Specify the URL
Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
pdfFromUrl.SaveAs("URLToPDF.pdf")
End Sub
End Class
IronPDF の機能
HTMLからのPDF生成
JavaScript、HTML、CSSをPDFに変換します。 メディアクエリやレスポンシブデザインなど、現代のウェブ標準に対応しています。 HTMLやCSSでPDFレポート、請求書、ドキュメントをダイナミックにデコレーションするのに役立ちます。
PDF編集
既存のPDFにテキスト、写真、その他のコンテンツを追加できます。 PDFファイルからテキストや画像を削除できます。 複数のPDFを1つのファイルに統合できます。PDFファイルを複数の別々の文書に分割することができます。 透かし、注釈、ヘッダー、フッターを含めることができます。
PDF変換
Word、Excel、および画像ファイルを含むさまざまなファイルタイプをPDF形式に変換します。 PDFから画像(PNG、JPEG、など)への変換。
性能と信頼性
高性能と信頼性は、広範なドキュメントコレクションを効果的に管理するために、産業環境で求められる設計特性です。
IronPDFをインストールする
.NETプロジェクトでPDFを操作するためのツールを手に入れるために、IronPDFパッケージをインストールしてください。
データをフルールでフェッチしてPDFを生成する
Flurlの流暢なAPIを利用してHTTPクエリを行い、APIからデータを取得します。 これはJSONデータを取得するインスタンスです:
using Flurl;
using Flurl.Http;
using IronPdf;
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
try
{
var response = await "http://localhost:5013/users/1".GetJsonAsync<User>();
var id = response?.Id;
var name = response?.Name;
Console.WriteLine($"Data fetched successfully: {name}");
// Generate PDF using IronPDF
var renderer = new ChromePdfRenderer();
string htmlTemplate = $@"
<html>
<body>
<h1>{id}</h1>
<p>{name}</p>
</body>
</html>";
// Generate PDF document from HTML template
var pdfDocument = renderer.RenderHtmlAsPdf(htmlTemplate);
// Save or stream the PDF document
pdfDocument.SaveAs(@"document.pdf");
Console.WriteLine("PDF document generated successfully.");
}
catch (FlurlHttpException ex)
{
Console.WriteLine($"HTTP Error: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
// Example model class for JSON deserialization
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}using Flurl;
using Flurl.Http;
using IronPdf;
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
try
{
var response = await "http://localhost:5013/users/1".GetJsonAsync<User>();
var id = response?.Id;
var name = response?.Name;
Console.WriteLine($"Data fetched successfully: {name}");
// Generate PDF using IronPDF
var renderer = new ChromePdfRenderer();
string htmlTemplate = $@"
<html>
<body>
<h1>{id}</h1>
<p>{name}</p>
</body>
</html>";
// Generate PDF document from HTML template
var pdfDocument = renderer.RenderHtmlAsPdf(htmlTemplate);
// Save or stream the PDF document
pdfDocument.SaveAs(@"document.pdf");
Console.WriteLine("PDF document generated successfully.");
}
catch (FlurlHttpException ex)
{
Console.WriteLine($"HTTP Error: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
// Example model class for JSON deserialization
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}Imports Flurl
Imports Flurl.Http
Imports IronPdf
Imports System
Imports System.Threading.Tasks
Friend Class Program
Shared Async Function Main(ByVal args() As String) As Task
Try
Dim response = await "http://localhost:5013/users/1".GetJsonAsync(Of User)()
Dim id = response?.Id
Dim name = response?.Name
Console.WriteLine($"Data fetched successfully: {name}")
' Generate PDF using IronPDF
Dim renderer = New ChromePdfRenderer()
Dim htmlTemplate As String = $"
<html>
<body>
<h1>{id}</h1>
<p>{name}</p>
</body>
</html>"
' Generate PDF document from HTML template
Dim pdfDocument = renderer.RenderHtmlAsPdf(htmlTemplate)
' Save or stream the PDF document
pdfDocument.SaveAs("document.pdf")
Console.WriteLine("PDF document generated successfully.")
Catch ex As FlurlHttpException
Console.WriteLine($"HTTP Error: {ex.Message}")
Catch ex As Exception
Console.WriteLine($"Error: {ex.Message}")
End Try
End Function
End Class
' Example model class for JSON deserialization
Public Class User
Public Property Id() As Integer
Public Property Name() As String
End ClassImports Flurl
Imports Flurl.Http
Imports IronPdf
Imports System
Imports System.Threading.Tasks
Friend Class Program
Shared Async Function Main(ByVal args() As String) As Task
Try
Dim response = await "http://localhost:5013/users/1".GetJsonAsync(Of User)()
Dim id = response?.Id
Dim name = response?.Name
Console.WriteLine($"Data fetched successfully: {name}")
' Generate PDF using IronPDF
Dim renderer = New ChromePdfRenderer()
Dim htmlTemplate As String = $"
<html>
<body>
<h1>{id}</h1>
<p>{name}</p>
</body>
</html>"
' Generate PDF document from HTML template
Dim pdfDocument = renderer.RenderHtmlAsPdf(htmlTemplate)
' Save or stream the PDF document
pdfDocument.SaveAs("document.pdf")
Console.WriteLine("PDF document generated successfully.")
Catch ex As FlurlHttpException
Console.WriteLine($"HTTP Error: {ex.Message}")
Catch ex As Exception
Console.WriteLine($"Error: {ex.Message}")
End Try
End Function
End Class
' Example model class for JSON deserialization
Public Class User
Public Property Id() As Integer
Public Property Name() As String
End Classこの例では、Flurlの.GetJsonAsync()関数を使用してGETリクエストを送り、JSONデータを取得します。 APIレスポンス構造を表すモデルクラス User に置き換え、"URL" を実際のAPIエンドポイントに置き換えてください。 HTMLテンプレート (htmlTemplate) は、IronPDFのChromePdfRendererクラスを使用してPDFドキュメントにレンダリングできます。 ここでは、APIから取得したタイトルと本文のデータを使用してHTMLテンプレートを動的に構築します。 作成されたPDFドキュメント (pdfDocument) はファイルシステムの指定された場所("document.pdf")に保存されます。 パスを必要に応じて変更してください。
Flurl C# (How It Works For Developers): 図6 - コンソールの出力例
ネットワーク障害 (FlurlHttpException) や一般的な例外 (Exception) などの問題に対して堅牢なエラーハンドリングを提供します。 IronPDFを使用して、ページサイズ、余白、ヘッダー、フッター、その他のPDF設定を変更できます。 高度なカスタマイズの可能性については、IronPDFのマニュアルを参照してください。 APIにHTTPクエリを送信する際には、敏感なデータやアクセストークンを安全に扱うことを確認してください。 APIが要求する適切な認証方法を使用してください。
結論
要約すると、C#アプリケーションでのFlurlによるAPIインタラクションとIronPDFによるPDF生成を組み合わせると、動的にデータを取得し、高品質なPDFドキュメントを生成するための強力な組み合わせを提供します。 その流暢なAPIにより、FlurlライブラリはHTTPリクエストを簡素化し、データを遠隔のエンドポイントから取得する際の柔軟性とユーザーフレンドリーさを提供します。 加えて、IronPDFはHTMLコンテンツをPDF形式に簡単に変換し、ヘッダー、余白、ページサイズなどの調整可能な機能を提供します。
この統合を実装する際には、スピードの最適化、データセキュリティ、およびエラーハンドリングも考慮することが重要です。 ベストプラクティスに従い、FlurlとIronPDFの利点を活用することで、開発者は現代のアプリケーションの要求を効果的に満たす信頼性がありスケーラブルなソリューションを作成できます。
IronPDFとIron Softwareのスイートは、Iron Softwareの高度に柔軟なシステムとコアサポートを組み合わせることで、さらなるオンラインアプリケーションと機能を提供し、より効率的な開発を可能にします。
ライセンスオプションがプロジェクトのニーズに明確で具体的であれば、開発者はどのモデルが最適でベストプラクティスなのかを判断しやすくなります。これらの利点により、開発者はさまざまな問題を明確で説得力のある方法で容易に統合できます。
ジェイコブ・メラーはIron Softwareの最高技術責任者(CTO)であり、C# PDFテクノロジーを開拓する先見的なエンジニアです。Iron Softwareのコアコードベースを支えるオリジナル開発者として、彼は創業以来、会社の製品アーキテクチャを形成し、CEOのCameron Rimingtonとともに、会社をNASA、Tesla、および世界的な政府機関にサービスを提供する50人以上の会社に変えました。1999年にロンドンで最初のソフトウェアビジネスを開業し、2005年に最初 for .NETコンポーネントを作成した後、Microsoftのエコシステム全体で複雑な問題を解決することを専門としました。