PDA

View Full Version : Embedded كردن DLL در فايل exe چطوري ؟



احمد سامعی
دوشنبه 10 فروردین 1388, 12:54 عصر
كسي مي تونه بگه چطوري مي شه يك فايل DLL داخل برنامه embedded resource كرد و از اون نمونه كلاس تعريف كرد و از اون شئ استفاده كرد ؟

در اين لينك (http://www.codeproject.com/KB/cs/DLL_as_Embedded_Resource.aspx) embedded اسكين گفته اما نمي شه براي كلاس لايبري ازش استفاده كرد(يعني من نفهميدم چطوري شئ تعريف كنم ...)

hdv212
دوشنبه 10 فروردین 1388, 18:14 عصر
موضوع خوبی بود، با اینکه خیلی وقت بود میخواستم روش کار کنم، اما وقت نمیکردم، به هر صورت مشکل شما باعث شد یه مروری روش انجام بدم، بدین صورت :
شما به وسیله ی Dynamic Loading میتونی اسمبلی مورد نظرت رو در حافظه Load و ازش نمونه سازی کنی.
این مثال از لینکی که شما گذاشته بودی الهام گرفته، شرایطش بدین صورته :

1. برنامه اولی به نام DynamicLoading-Dll هست که خروجیش یک dll ساده س که ما ازش در برنامه دوم استفاده میکنیم، این dll دارای یک کلاس به نام SampleType می باشد که متدی به نام DoWork داره (لطفا فایل مورد نظر را ببینید)

2. برنامه دومی که اصل کار ماست، یک نمونه برنامه است به نام DynamicLoading-App که dll حاصل از پروژه اولی در این برنامه Import شده و خاصیت BuildAction آن برابر با EmbeddedResource قرار گرفته(این dll به صورت Resource در برنامه قرار گرفته)، حالا وظیفه ی ما بدین صورت میشه :

الف) Load کردن اسمبلی مورد نظر در حافظه
ب) پیدا کردن کلاس مورد نظر در اسمبلی موجود
ج) نمونه سازی از کلاس مورد نظر و اجرا کردن متد مورد نظر آن با استفاده از کلاس MethodInfo

در برنامه ی مورد نظر، یک فرم داریم که یک Button ساده روی آن قرار دارد که با کلیک بر روی آن، اسمبلی مورد نظر از Resource برنامه خوانده شده و در حافظه Load میشود، سپس از کلاس SampleType نمونه ای به نام obj ساخته شده و با استفاده از کلاس MethodInfo، تابع DoWork با پارامترهای مورد نیاز فراخوانی میشود و نتیجه (که برابر با خروجی تابع DoWork است) در یک متغیر String ذخیره میشود و به کاربر نمایش داده میشود. همین!

توجه : این روش به کمک مهندسی معکوس [ System.Reflection ] انجام میشود.

سوالی بود در خدمتم.

احمد سامعی
دوشنبه 10 فروردین 1388, 23:05 عصر
خيلي خيلي منون
واقعاً مثالتون كامل بود و من اون چيزي كه مي خواستم فهميدم تونستم انجام بدم




توجه : این روش به کمک مهندسی معکوس [ System.Reflection ] انجام میشود.


من فكر مي كردم مهندسي معكوس يك جور دي كمپايل كردن ... حال حداقل يكم از تعريفش فهميدم.
اما يك سؤال دارم منون مي شم جواب بدين:

آيا با اين روش مخفي كردن DLL در داخل فايل exe وقتي برنامه رو با برنامه هايي reflector باز كنن محتويات اين DLL رو هم مي تونن ببين ؟
منظورم اينكه آيا اين راهي مي توني براي جلوگيري از ديدن سورس DLL ها باشه ؟

hdv212
سه شنبه 11 فروردین 1388, 02:23 صبح
من فكر مي كردم مهندسي معكوس يك جور دي كمپايل كردن ... حال حداقل يكم از تعريفش فهميدم.
تقریبا درسته، در دات نت این قابلیت وجود داره که بتونید از فایل اجرایی به کد برسید!


آيا با اين روش مخفي كردن DLL در داخل فايل exe وقتي برنامه رو با برنامه هايي reflector باز كنن محتويات اين DLL رو هم مي تونن ببين ؟
بله میتونن ببینن، همانطور که شما تونستی ببینی!


منظورم اينكه آيا اين راهي مي توني براي جلوگيري از ديدن سورس DLL ها باشه ؟
به عنوان قدم اول آره، اما هرکس که بتونه برنامه شما رو با Reflector باز کنه، اسمبلی مورد نظر رو هم میبینه، برای این کار شما میتونید از ابزارهای محافظت از سورس کد استفاده کنید، مثل XenoCode PostBuild (http://www.xenocode.com/Products/Postbuild-for-NET/)

احمد سامعی
سه شنبه 11 فروردین 1388, 11:17 صبح
بله میتونن ببینن، همانطور که شما تونستی ببینی!


باز هم منون
اما من يك برنامه Reflector دارم كه وقتي سورس باز مي كني قسمت Resource فقط به صورت باينري نشون مي ده و اون DLL كه EmbeddedResource كردم فقط به صورت باينري نشون مي ده ازش چيزي نمي شه فهميد

مي شه يك برنامه كه DLL EmbeddedResource شده رو هم نشون بده اگر لينك داريد بديد تست كنم

Mehdi Asgari
چهارشنبه 12 فروردین 1388, 17:08 عصر
روش دیگر استفاده از BoxedApp SDK (www.boxedapp.com/boxedappsdk/) هست (یکی از مثال های همراهش ، embed کردن DLL هست)