PDA

View Full Version : Embed کردن دات نت فریمورک در برنامه C#



opinions
پنج شنبه 21 آبان 1394, 09:03 صبح
سلام. دوستان چطوری میتونم دات نت فریمورک رو در برنامه ای که با سی شارپ نوشتم embed کنم یا مثلا لینک استاتیک کنم؟ طوری که برنامه در سیستم هایی که دات نت روی اونها نصب نیست اجرا بشه؟؟؟

البته نمیخوام یه ستاپ درست کنم که دات نت رو نصب کنه، میخوام فایل exe برنامم یه تک فایل باشه که توش دات نت هم داشته باشه...

elec60
پنج شنبه 21 آبان 1394, 09:25 صبح
کل دات نت رو که نميشه تو فايل اجرایی embed کنی!! پس تکليف CLR چی میشه؟ تکليف Garbage Collector چی ميشه؟! مايکروسافت داره رو Net Native. کار ميکنه که تا الان برای Application های Windows Store کامل شده و در آينده برای Desktop هم تکميلش میکنه. کارشم هم اينه که تو سیستم نهایی ديگه نيازی به دات نت نخواهد بود و فقط یه برنامه کوچیک وجود خواهد داشت که کار GC رو انجام میده. با اين روش Productivity ايه دات نت و Performance نيتيو رو خواهيم داشت!

اما اگه تو برنامتون یک یا چند dll دارين که تو دات نت نيستن(برای مثال dll های مربوط به EF) ميتونين اينها رو تو فايل اجراييتون embed کنين:

ابتدا اين dll ها رو به Project ويژوال استوديو اضافه کنين و سپس تو Property هر کدوم Build Action رو Embedded Resource قرار بدين و اين باعث ميشه تا کامپايلر سی شارپ dll های شما رو به فايل exe امبد کنه.
اما در ران تايم، CLR قادر نخواهد بود تا Assembly های وابسته رو پيدا کنه مگر اينکه بهش حالی کنيم که embed شون کرديم:

وقتی برنامه Initialize ميشه اين event رو register کنين:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
String resourceName = "AssemblyLoadingAndReflection." +
new AssemblyName(args.Name).Name + ".dll";
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourc eStream(resourceName))
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
} };



برای اطلاعات دقيق تر به کتاب بسيار عالی و البته دشوار #CLR via C نوشته Jeffrey Richter مراجعه کنين.