نوشته های یک برنامه نویس

تجربیات شخصی محمد باقری نسب
محمد باقری نسب

نوشته های یک برنامه نویس

تجربیات شخصی محمد باقری نسب

ساخت Setup سفارشی با تکنیک MSI Wrapping

پیش نیاز: تسلط به زبان #C دات نت

یکی از دغدغه های مهم هر برنامه نویس پس از نوشتن یک نرم افزار تجاری و رسیدن به مرحله ارائه به مشتری، ساخت و طراحی برنامه نصب یا همون Setup هست.

 

msi

 

در روند طراحی یک Setup نکات مختلفی مد نظر برنامه نویس قرار می گیره که برخی از اونها عبارتند از:

• قابلیت کپی فایلهای نرم افزار بر روی سیستم مقصد و امکان تغییر مسیر نصب نرم افزار

• ساخت میانبر در بخشهای مختلف سیستم مقصد. مثلا بر روی Desktop

• امکان دسترسی به Registry ویندوز و اعمال تغییرات مورد نیاز

• امکان دسترسی به برنامه نصب از طریق کنترل پنل، بخش نرم افزار های نصب شده بر روی سیستم

• امکان طراحی رابط کاربری (UI) سفارشی و دلخواه جهت نمایش مراحل نصب به کاربر

• و خیلی امکانات دیگه...

در این مقاله قصد دارم روشی به شما یاد بدم که تمامی نیازهای نصب یک برنامه که در بالا ذکر شد رو برآورده میکنه و همچنین شما میتونید رابط کاربری سفارشی و دلخواه خودتون رو به راحتی و با کمترین دردسر، جایگزین پنجره خشک و بی روح برنامه های نصب کنید.

 

روشهای ایجاد یک برنامه نصب

برای ساخت Setup میشه از روشهای مختلفی استفاده کرد. جهت آشنایی بیشتر، برخی از این روش ها رو به طور خلاصه مرور میکنیم.

 

روش اول: استفاده از برنامه های ساخت Setup

اولین روشی که به طور استاندارد می توان از آن استفاده کرد ، بکارگیری نرم افزار های تولید Setup است که تعداد این گونه از نرم افزارها هم بسیار زیاد بوده و تقریبا همه آنها در دسترس برنامه نویسان ایرانی قرار دارند. مزیت این روش نسبت به روشهای دیگر راحتی و سرعت بالای ساخت یک برنامه نصب می باشد، به طوری که مثلا اگر شما آشنایی متوسطی با برنامه InstallShield که یکی از نرم افزارهای قدرتمند در این زمینه می باشد داشته باشید ، در عرض چند دقیقه می توانید یک Setup با تمامی امکانات مورد نیاز خود پیاده سازی نمایید. شاید تنها عیبی که این روش نسبت به بقیه روشها داشته باشد این است که رابط کاربری برنامه نصب قابل سفارشی شدن نمی باشد. بدین معنی که شما نمی توانید به طور کامل رابط کاربری Setup را طبق سلیقه خود پیاده سازی نمایید و حتما می بایستی از قالبهای استانداردی که وجود دارد استفاده کنید.

 

روش دوم: ساخت Setup به صورت دستی

روش دیگری که می توان از آن برای تولید برنامه نصب استفاده نمود ، به صورت دستی و یا توسط خود برنامه نویس می باشد. به این شکل که برنامه نویس خود با نوشتن برنامه ای در قالب Setup آنرا پیاده سازی می نمایید. تنها مزیتی که این روش نسبت به روش قبلی دارد این است که در این روش هیچ محدودیتی جهت طراحی و سفارشی کردن رابط کاربری برنامه وجود ندارد و شما به دلخواه می توانید رابط کاربری برنامه نصب را پیاده سازی نمایید. عیب بزرگی که در این روش نسبت به بقیه روشها وجود دارد این است که پیاده سازی قابلیتهای یک Installer خوب برای این برنامه کاری بس دشوار و وقت گیر می باشد. چرا که شما نمی توانید تمامی امکاناتی که یک نرم افزار ساخت Setup به شما می دهد را ، به سرعت و بدون کاستی نوشته و آن را در قالب یک برنامه نصب ارائه نمایید.

 

روش سوم: ساخت Setup با تکنیک MSI Wrapping

روشی که این مقاله به آن می پردازد در واقع ترکیبی است از روش اول و دوم که بنده خود آنرا آماده سازی کرده ام و به صورت یک فایل DLL ، برای استفاده ارائه کرده ام. با استفاده از این کتابخانه قدرت و امکانات بالا و سرعت در پیاده سازی در روش اول ، و سفارشی بودن رابط کاربری در روش دوم با یکدیگر ترکیب می شوند و نتیجه کار چیزی خواهد شد که تمامی خواسته های مارا از یک Setup ایده ال برآورده می سازد.

 

مطمئن هستم که همه برنامه نویسان عزیز با فایلهای MSI آشنایی داشته و از کاربرد آن در ویندوز اطلاع دارند ولی بطور خلاصه:

MSI مخفف Microsoft Installer می باشد که جهت رفع مشکلات مربوط به انتشار و مدیریت برنامه‌های مبتنی بر Windows می باشد که در زمان Windows 2000  معرفی شد. شرکت مایکروسافت Windows Installer را با نام msiexec.exe به عنوان یک سرویس در Windows قرار داد. وظیفه این سرویس، نصب، تعمیر و پاک سازی نرم‌افزارهایی است که با دستورالعمل خاص در فایل‌های MSI بسته بندی شده اند. در حقیقت فایل‌های MSI بانک‌ داده ای حاوی همه اطلاعاتی اند که بسته نرم‌افزاری جهت نصب به آن‌ها احتیاج دارد.

به طور خلاصه فرآیندی که قرار است در این تکنیک انجام شود بدین شکل است که در ابتدا برنامه ای با یکی از زبانهای برنامه نویسی تحت دات نت می نویسید و در آن از کتابخانه ای که در پایان مقاله پیوست شده است استفاده می کنید. فایل MSI حاوی داده های نرم افزار مورد نظر جهت نصب ،که بوسیله نرم افزار های مختلف ساخت Installer از جمله InstallShield و یا AdvancedInstaller تولید شده است را بوسیله ی دو تابع Install و Uninstall که توابعی از کلاس Setup هستند ، فراخوانی می نمایید.

با استفاده از رویداد OnProgress می توانید درصد پیشرفت را به شکل دلخواه نمایش دهید. قابلیت ارجاء فرمان انصراف از ادامه عملیات نیز در رویداد OnProgress تعبیه شده است. تا وقتی که مقدار برگشتی از تابع Handler این رویداد True باشد برنامه نصب به کار خود ادامه می دهد و زمانی که مقدار برگشتی False شود ادامه عملیات لغو می گردد. (انصراف از عملیات نصب و یا حذف)

 

نکته: برای ساخت نمونه ای از کلاس Setup که در کتابخانه MSIWrapper پیاده سازی شده است ، می بایست ProductCode فایل MSI تولید شده را به عنوان پارامتر به ورودی انتقال دهید. ProductCode متغییری است حاوی شناسه ی محصولی که فایل MSI قرار است آن را بر روی سیستم نصب نماید. این شناسه در برنامه هایی که با آن فایل MSI را تولید می کنید قابل تعریف و تغییر می باشد.

 

نمونه ای صحیح از ProductCode:

{6BEA48F8-F7A2-41C1-B215-16A4185D118B}

 

نمونه ای از عملکرد کتابخانه برای دانلود آماده شده است.

فایل MSI هم توسط برنامه Advanced Installer 8.0 تولید شده است.

 

توضیح عملکرد برنامه نمونه:

 

 

روند کلی این است که کتابخانه ی MSIWrapper فایل MSI شما رو بوسیله ی کلاس Setup و توابع Install و Uninstall بارگزاری می کند. سپس فایل MSI ، به صورت Silent اجرا شده و فرامین مربوطه ، به آن ارسال می شود و نهایتا پیشرفت عملیات نیز از آن دریافت شده و به برنامه شما ارائه می شود تا به شکل دلخواه این روند را نمایش دهید. در اصل در این روش مزیتهای دو روش دیگر که هر دو برای شما خیلی حیاتی هستند ، باهم ترکیب شده و نهایتا نتیجه کار برنامه نصبی خواهد شد که هم از از نظر قدرت و توانایی هایی که دارد با روش اول برابری می کند و هم از نظر رابط کاربری قابل سفارشی که با روش دوم برابری می کند.

پس با این حساب شما به طور کلی می توانید از این به بعد بدون فکر کردن به هر یک از معایبی که روشهای قبلی داشتند ، از روش جدید استفاده کنید و به قول مروف "همان چیزی را که می خواهید از آب در بیاورید".

 

ساختار کلاس Setup بدین شکل است:

 

توابع:

Install: پارامتر اول مسیر فایل MSI مورد نظر جهت نصب و پارامتر دوم مسیری که قرار است برنامه در آنجا نصب شود. در صورتی که مشکلی در روند کار پیش نیاید مقدار True و در غیر این صورت مقدار False از تابع بر می گردد. مثلا در صورتی که برنامه قبلا نصب شده باشد مقدار برگشتی False خواهد بود.

 

Uninstall: تنها پارامتر ، مسیر فایل MSI مورد نظر جهت حذف برنامه می باشد. در صورتی که مشکلی در روند کار پیش نیاید مقدار True و در غیر این صورت مقدار False از تابع بر می گردد. مثلا در صورتی که هنوز برنامه نصب نشده باشد مقدار برگشتی False خواهد بود.

 

خصیصه ها:

InstallationDirectory: مسیر نصب. در صورتی که برنامه قبلا نصب شده باشد رشته ای حاوی مسیری است که در آن برنامه قبلا نصب شده است.

IsInstalled: جهت بررسی وضعیت کنونی نصب برنامه ، که آیا برنامه بر روی سیستم نصب می باشد یا خیر.

ProductCode: کد محصول که در سازنده کلاس به عنوان ورودی می بایست ارسال شود.

ProductName: نام برنامه ای که قرار است حذف و یا نصب شود.

 

رویداد:

OnProgress: پارامتر اول مقدار کنونی پیشرفت و پارامتر دوم حداکثر مقدار پیشرفت می باشد (که معمولا پارامتر اول جهت مقدار دهی خصیصه ی Value از ProgressBar و پارامتر دوم جهت مقدار دهی خصیصه ی Maximum). پیشرفت عملیات حذف و یا نصب نرم افزار. مقداری که باید از Handler این رویداد برگردد مشخص می کند که آیا عملیات ادامه پیدا کند و یا خیر. (مقدار True جهت ادامه عملیات و مقدار False جهت انصراف از ادامه عملیات)

 

 

پیوست

دانلود پروژه‌ی نمونه (۲۰۴ کیلوبایت)
 
امیدوارم این مقاله برای شما مفید بوده باشه، سوال یا مشکلی بود کامنت بذارید حتما پاسخ میدم؛ موفق باشید!

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
تجدید کد امنیتی
این سایت رو تنها به دلیل علاقم به نوشتن و به اشتراک گذاری تجربیاتم با دیگران ایجاد کردم و هر از گاهی اگر فرصت کنم می‌نویسم شاید به درد کسی بخوره، پس کپی برداری از محتوا بدون ذکر منبع هیچ اشکالی ندارد! اما اگر ذکر کردین هم خوشحالم می‌کنید 😊️
آخرین نظرات
  • ۲۴ شهریور ۹۶، ۱۱:۱۱ - دانلود آهنگ جدید
    عالی
دسته بندی ها