۱۳۸۷/۰۸/۱۹

نصب يك اسمبلي دات نت در GAC


افزونه فارسي به پارسي را قبل از ارائه در سايت، بر روي يك ماشين مجازي هم تست كردم. براي اين منظور از Microsoft virtual pc استفاده شد. البته در مقابل امكانات VMware شايد حرفي براي گفتن نداشته باشد ولي خوب جهت مقاصد تست نرم افزار بر روي يك سيستم عاري از وسايل برنامه نويسي مناسب است. (براي نصب يك سيستم عامل توسط آن براي مثال مي‌شود از سي دي آن OS يك فايل ISO تهيه كرد و مسير اين فايل ISO را به ماشين مجازي معرفي كرد . سپس سيستم بوت شده و روال نصب مطابق معمول خواهد بود)
اولين مشكلي كه پس از تست بر روي سيستم مجازي رخ داد، پيغام يافت نشدن اسمبلي مربوط به SQLite بود. نرم افزار word هنگام اجراي افزونه‌هاي دات نت، آنها را در مسيري با يك نامگذاري منحصربفرد كپي مي‌كند و تنها هم همان اسمبلي افزونه را كپي مي‌كند و نه ساير موارد همراه را. براي پيدا كردن اين مسير مي‌شود از روش زير استفاده كرد:
using System.Reflection;
Assembly.GetExecutingAssembly().Location

در اين مسير اسمبلي SQLite وجود ندارد و به همين دليل هم بارگذاري نخواهد شد. بهترين راه حل براي رفع اين مشكل، نصب اسمبلي مربوطه در GAC يا global assembly cache است.
براي نصب اسمبلي در GAC استفاده از برنامه gacutil توصيه شده است. اين برنامه به همراه SDK دات نت فريم ورك ارائه مي‌شود و الزامي ندارد كه كاربر نهايي اين برنامه را داشته باشد. خوشبختانه با استفاده از برنامه نويسي هم مي‌شود يك نمونه از برنامه Gacutil را خودمان ايجاد كنيم (براي مثال ايجاد يك برنامه كنسول و دريافت مسير از طريق آرگومان‌هاي ارسالي به آن):

new System.EnterpriseServices.Internal.Publish().GacInstall(path);

در اينجا بايد ارجاعي از System.EnterpriseServices نيز به برنامه اضافه شود.
اين روش در مورد اسمبلي SQLite كه داراي امضاي ديجيتال است كار خواهد كرد. اما اگر قصد داشته باشيد به صورت عمومي از آن استفاده كنيد، بايد ابتدا بررسي كرد كه آيا فايل اسمبلي داراي امضاي ديجيتال است يا خير. براي اين منظور مي‌توان مقدار عبارت زير را ارزيابي كرد:
Assembly.LoadFile(path).GetName().GetPublicKey().Length

اگر اين طول بزرگتر از صفر بود به اين معنا است كه فايل اسمبلي داراي امضاي ديجيتال است و مي‌توان آنرا در GAC نصب كرد.
لازم به ذكر است كه متد معرفي شده براي نصب در GAC در صورت عدم موفقيت هيچ پيغام خطا يا exception ايي را در برنامه توليد نخواهد كرد. اما پيغام خطاي حاصل را در event log ويندوز مي‌توان مشاهده كرد.