آشنایی با CsWin32 برای تولید کدهای P/Invoke در دات نت
در این مطلب با پکیج نوگت CsWin32 برای تولید کدهای P/Invoke در دات نت آشنا خواهیم شد.

CsWin32 چیست؟
ابزار CsWin32 یک Source Generator برای تولید کدهای P/Invoke ویندوز (Win32) برای دات نت است. با استفاده از این ابزار شما میتوانید تنها با تعریف نام متد، کلاس، اینترفیس و... کدهای مورد نیاز برای P/Invoke را در هنگام کامپایل تولید و سپس استفاده کنید.
مطالب مرتبط با این موضوع:
- ⚡آشنایی با P/Invoke در دات نت
- ⬅️ آشنایی با CsWin32 برای تولید کدهای P/Invoke در دات نت (همین مطلب)
نحوه نصب
با استفاده از Package Manager Console در ویژوال استودیو پکیج نوگت Microsoft.Windows.CsWin32 را نصب کنید.
Install-Package Microsoft.Windows.CsWin32
نکته: در صورتی که قصد دارید از این پکیج نوگت در دات نت فریمورک 4.5 به بالا و یا دات نت استاندارد 2.0 استفاده کنید لازم است پکیجهای نوگت زیر را نیز نصب کنید.
Install-Package System.Memory
Install-Package System.Runtime.CompilerServices.Unsafe
ℹ️ برای کسب اطلاعات بیشتر، فایل readme.txt که هنگام نصب CsWin32 به شما نمایش داده خواهد شد را مطالعه کنید.
نحوه استفاده
- ابتدا یک فایل متنی با نام
NativeMethods.txtرا در پوشه پروژه ایجاد کنید. - سپس داخل فایل، نام متد، کلاس، اینترفیس و یا سایر اجزاء مورد نظر خود را وارد کرده و سپس ذخیره کنید.
برای نمونه، فانکشن MessageBoxW که در مطلب آشنایی با P/Invoke در دات نت از آن استفاده کردیم را در فایل متنی وارد میکنیم.
MessageBoxW
سپس میتوانیم به شکل زیر از متد MessageBox تولید شده استفاده کنیم.
// using Windows.Win32;
// using Windows.Win32.Foundation;
// using Windows.Win32.UI.WindowsAndMessaging;
PInvoke.MessageBox(new HWND(0), "Command-line message box", "Attention!", MESSAGEBOX_STYLE.MB_OK);
با مراجعه به بخش Analyzers در پروژه خود میتوانید کدهای تولید شده را بررسی کنید.

همانطور که میتوانید مشاهده کنید، تمامی کلاسها، Enumها و سایر اجزاء مورد نیاز برای استفاده از متد MessageBoxW به صورت خودکار تولید شده و آماده استفاده هستند.
این بدان معناست که برای مثال قبلی، به راحتی میتوانیم با تغییر MESSAGEBOX_STYLE به مقادیر دلخواه، ظاهر پیغام را تغییر داده و همچنین نتیجه آن را نیز به صورت Enum دریافت کنیم.
MESSAGEBOX_RESULT result = PInvoke.MessageBox(new HWND(0), "Close?", "Question",
MESSAGEBOX_STYLE.MB_YESNO | MESSAGEBOX_STYLE.MB_ICONQUESTION);
Console.WriteLine(result);
CsWin32 چگونه کار میکند؟
ابزار CsWin32 با استفاده از متادیتای Win32 که توسط مایکروسافت جمع آوری شده است، متدها، کلاسها، اینترفیسها و سایر موارد تعریف شده در فایل NativeMethods.txt را همراه با تمامی اجزاء مرتبط با آن را توسط یک Source Generator تولید میکند. با این کار شما میتوانید به راحتی از APIهای Win32 در پروژههای خود استفاده کرده و نیازی به نوشتن دستی کدهای تشریفاتی نداشته باشید.