گنجاندن DLLها در فایل اجرایی کامپایل شده در C#
در بسیاری از مواقع، برای ساده سازی توزیع و نصب برنامه به دنبال این هستیم که DLLها و وابستگی ها را در یک فایل اجرایی C# جا دهیم و در نتیجه فقط یک فایل برای توزیع داشته باشیم.
یکی از بهترین و آسانترین روشها برای گنجاندن DLLها در فایل اجرایی، استفاده از Costura.Fody است. با استفاده از این ابزار، میتوانید به راحتی همه DLLهای وابسته که به پوشه خروجی کپی میشوند را به اسمبلی اصلی خود بچسبانید. برای این کار، کافیست به سادگی این بسته را نصب کنید:
Install-Package Costura.Fody
پس از افزودن آن به پروژه، این بسته بهطور خودکار DLLها را گنجانده و شما میتوانید همچنین گزینههایی برای حذف برخی از اسمبلیها یا بارگزاری آنها در حین اجرا نیز داشتهباشید. بهعلاوه، این ابزار از اسمبلیهای غیرمدیریت شده (غیر دات نتی) نیز پشتیبانی میکند.
روش دیگری که میتوانید از آن استفاده کنید، گنجاندن DLLها بهعنوان منابع در خود پروژه است. برای انجام این کار در Visual Studio، پروژه خود را راستکلیک کرده و به Properties بروید، سپس در تب Resources، DLLهای مورد نظر را به منابع خود اضافه کنید. کدی که لازم است در App.xaml.cs
یا معادل آن اضافه کنید به صورت زیر است:
public App()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
string dllName = args.Name.Contains(',') ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll", "");
dllName = dllName.Replace(".", "_");
if (dllName.EndsWith("_resources")) return null;
System.Resources.ResourceManager rm = new System.Resources.ResourceManager(GetType().Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());
byte[] bytes = (byte[])rm.GetObject(dllName);
return System.Reflection.Assembly.Load(bytes);
}
این کد به شما امکان میدهد DLLهایی که به منابع پروژهتان اضافه کردهاید را در زمان اجرا بارگذاری کنید. توجه داشته باشید که اگر شما از تمهای سفارشی استفاده میکنید، ممکن است نیاز به بررسی وجود PresentationFramework
در نام DLL داشته باشید تا از بروز مشکلات جلوگیری کنید.
اگر DLLها Managed باشند، میتوانید از ILMerge برای ادغام آنها استفاده کنید، ولی اگر DLLها Native بودند، ممکن است فرایند ادغام کمی پیچیدهتر باشد.
در نهایت، بسته به نیاز پروژه و نوع اسمبلیهایی که میخواهید گنجانده شوند، میتوانید از هر یک از این روشها بهرهمند شوید.