# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > مقالات مرتبط با Microsoft .Net Framework >  بررسی معماری پلت فرم .NET

## omid_Ahmadi

سلام
مقاله ی زیر در مورد معماری پلت فرم .NET است. امیدوارم که مفید باشه. اگر مشکلی داشته باشه، خوشحال میشم بگید.
در ضمن هر سوالی هم که در مورد اوون داشتید و یا هر قسمتی که نا مفهوم بود رو می تونید در ادامه ی همین تاپیک بپرسید.

----------


## بابک زواری

آقای احمدی نخونده میگم دستت درد نکنه ؛ بعنوان یکی از اعضای باسواد بخش دات نت قابل تحسین هستید .

----------


## omid_Ahmadi

استاد این طور که شما میگید هم نیست. من فقط درسی رو که از دوستان توی همین سایت یاد گرفتم دارم پس می دم.

----------


## niloufar

سلام
من هم تازه دیدمش ولی نخونده میدونم خیلی مفیده چون در تاپیک های قبلی دیدم که اطلاعات شما در مورد معماری Framework واقعا کامله
ممنون
ضمنا آقای احمدی (شاید هم هاشمیان) یه چند تا سوال قبلا عرض کرده بودم که "آیا با تبدیل کدهای IL به Native امنیت به حد کدهای کامپایل شده با VB6 برمیگرده یا نه؟ و اگه هم سرعتش بالاتره و هم امنیتش پس چرا IL اصلا استفاده میشه؟ و برای استفاده از Ngen باید از کدهای کامپایل شده استفاده کرد یا خیر و اگه بخوایم فقط برخی کلاس ها تبدیل به Native بشن چگونه؟" آیا به این سوالات هم تو همین مقاله پاسخ داده اید؟ اگر نه یا اگه دقیق نه، لطفا یه نیمچه توضیحکی بدید. ممنون

----------


## omid_Ahmadi

> آیا با تبدیل کدهای IL به Native امنیت به حد کدهای کامپایل شده با VB6 برمیگرده یا نه؟


بله




> و اگه هم سرعتش بالاتره و هم امنیتش پس چرا IL اصلا استفاده میشه؟


دلیلش به علت مواردی هست که توی این مقاله و همین طور توی یه مقاله ی دیگه که توی این سایت در مورد مدیریت حافظه نوشتم توضیح داده شده. البته به زودی PDF مقاله ی مدیریت حافظه رو هم توی سایت قرار می دم.

سوالات بعدی هم فکر کنم از داخل مقاله قابل استنتاج باشه

----------


## niloufar

سلام
آقای احمدی! با این اوصاف شما چی توصیه میکنید:
1- آیا کامپایلها رو Native کنیم یا نه؟
2- اصلا و اساسا دنبال حذف فریم ورک باشیم یا نه؟

----------


## niloufar

یه چیز دیگه:
اگه میفرمایید که با Native کردن کدها (که ظاهرا با ngen مجانی هم هست) میشه امنیت رو بالا برد و از دی کامپایل شدن جلوگیری کرد، پس اساسا برای چی برنامه هایی مثل XenoCode شکل میگیرند و اساسا چرا اینقدر طرفدار پیدا میکنند و باز اساسا چرا بینشون رقابت هم ایجاد میشه؟

----------


## omid_Ahmadi

> آیا کامپایلها رو Native کنیم یا نه؟


بستگی به شرایط داره، معمولا واسه افزایش امنیت بعضی از قسمتهای کد باید این کار رو انجام داد. توی مقاله گفتم که چرا باید این کار رو کرد.




> اصلا و اساسا دنبال حذف فریم ورک باشیم یا نه؟


ترجیحا نه. ولی خوب اگه دیگه هیچ راهی نبود میشه این کار رو کرد.




> اگه میفرمایید که با Native کردن کدها (که ظاهرا با ngen مجانی هم هست) میشه امنیت رو بالا برد و از دی کامپایل شدن جلوگیری کرد، پس اساسا برای چی برنامه هایی مثل XenoCode شکل میگیرند و اساسا چرا اینقدر طرفدار پیدا میکنند و باز اساسا چرا بینشون رقابت هم ایجاد میشه؟


خوب ممکنه خیلی ها حتی اسم ngen هم به گوششون نخورده باشه و یا خیلی ها نحوه ی استفاده از اون رو بلد نباشن یا ... اساسا نمی دونم، اینو از کاربراش بپرسید :لبخند گشاده!:

----------


## ramin_rp

سلام

ممنون دوست عزیز

----------


## vbapr2005

بشددددت متشکرم

----------


## niloufar

سلام
ممنون. نحوه کار ngen چی شد؟ هنوزم به سوئیچ ?/ مراجعه کنیم؟ من هنوز نمیدونم باید کدهای کامپایل شده رو تبدیل کرد و یا کامپایل نشده و چه طور میشه برخی قسمتا رو فقط native کرد؟ یا شایدم تو مقاله توضیح دادید که اگه اینطوره خیلی باید عرق شرمندگی از خودم پاک کنم چون هنوز فرصت نکردم بخونمش.
بازم ممنون

----------


## omid_Ahmadi

سلام،
نمی دونم چه طور بهتون توضیح بدم، negn برای این کاری که الان شما می خواهید انجام بدید ایجاد نشده. ngen برای چند تا دلیل خاص ایجاد شده که مهمترینش اینه:
فرض کنید شما در حال نشوتن برنامه ای هستید که یه قسمتی از اون خیلی براتون مهمه. اون قدر که نمی تونید به obfuscator ها اطمینان کنید که کد رو براتون محافظت کنه، مثل قسمت تاید شماره سریال برنامه یا .... تو این جور مواقع می تونید این قسمت از برنامه رو توی یه کلاس خاص بنویسید و بعد اون کلاس رو با این برنامه به کد native تبدیل کنید. به این ترتیب می تونید با استفاده از ویژگی برقراری رابطه ی بین کد های managed و unmanaged در CLR امنیت مورد نظرتون رو توی اون قسمت تامین کنید. 

ngen روش کاربرد خاصی نداره که من بخواهم بهتون توضیح بدم. این برنامه، یه دستور Command-Line ه که اسم فایل IL رو به عنوان ورودی می گیره و فایل Native اوون رو اجرا می کنه.
اما این فایل به تنهایی نمی تونه روی یه سیستم دیگه اجرا بشه، چون به فایلهای موجود در GAC نیاز داره و ... کلی قضایای دیگه. 

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

----------


## niloufar

سلام
آقای احمدی! 
1- من همین که به قول شما یه کلاس مهم رو بخوایم با ngen تبدیل به کدهای native کنیم نمیدونم چه جوریه
2- این توضیحات آخرین پست شما که منو باز هم گیج تر کرد (حالا نگی: ای هیچی نوفهمه!!) چون تا حالا من فکر میکردم که ورودی این ngen یه فایله (اونم از نوع فایلهای عادی دات نت) حالا یا کامپایل شده و یا کامپایل نشده (که یه سوالم هم همین بود) و یه فایل خروجی بهمون تحویل میده که کدهای native اند و باید اون فایلها را به جای فایل های اصلی به کاربر تحویل بدیم (یا تو نصاب ازشون استفاده کنیم)
اما شما میفرمایید:



> این برنامه، یه دستور Command-Line ه که اسم فایل IL رو به عنوان ورودی می گیره و فایل Native اوون رو اجرا می کن


یعنی چی چی که اجرا میکنه!! یعنی فایل خروجی نداره و اگه بخوایم اجرا بشه باید همیشه با خود ngen اجراش کنیم!! البته اینایی که دارم الان مینویسم رو خودم میدونم غیر منطقیه اما از فرمایش شما این برمیاد و میخوام شما توضیحشو بدید.

خلاصه آقای احمدی!! دست از سرتون بر نمیدارم (عجب رویی دارم) تا بهم توضیح بدید که اگه بخوام کل پروژه یا بخشی از اونو مخفی کنم تا قابل برگشت (نه به زبونای سطح پایین بلکه با دات نت) نباشه (یه چیزی مثل کامپایل های vb6) باید چی کار کنم: چه فایلی رو با ngen چی کار کنم، خروجی چی میگیرم و اونو چه جوری میتونم بدم دست حضرت کاربر که ازش استفاده کنه.

با اینکه میدونم خیلی روم زیاده، ولی تقاضا دارم که این لطفو کنید و به این بنده خدا (و احتمالا دیگران که اصلا تو فاز این تاپیک نیستند، حالا نمیدونم چرا؟!) توضیح دهید.

ممنون

----------


## omid_Ahmadi

بهتره قبل از اینکه جواب سوالهای شما رو بدم، شما به یه سوال من جواب بدید.
شما توی نوشتن برنامه تون با مشکلی مواجه شدید که فکر می کنید با استفاده از این ابزارها حل میشه یا اینکه فقط می خواهید در مورد اونها اطلاعات داشته باشید؟
اگه حالت اول درسته لطفا مشکل برنامه تون رو بگید تا راه حلشو بگم (البته اگر تونستم).

اگر حالت دوم هم درسته که ...

موفق باشید.

----------


## mamadgmail

آقا خیلی ممنون من نمی دونم چرا قبلا چرا به اینجا سر نزده بودم. کلی به یک همچین مطلبی نیاز داشتم.ممنون

----------


## niloufar

> بهتره قبل از اینکه جواب سوالهای شما رو بدم، شما به یه سوال من جواب بدید.
> شما توی نوشتن برنامه تون با مشکلی مواجه شدید که فکر می کنید با استفاده از این ابزارها حل میشه یا اینکه فقط می خواهید در مورد اونها اطلاعات داشته باشید؟
> اگه حالت اول درسته لطفا مشکل برنامه تون رو بگید تا راه حلشو بگم (البته اگر تونستم).
> 
> اگر حالت دوم هم درسته که ...
> 
> موفق باشید.


سلام
:-)
خوب چه فرقی داره؟! اگه هم بخوایم اطلاعاتمون بالا بره که کلی خوبه :-) 
اما به هر حال نه! فقط صرف دونستن نیست! حقیقتش اصلیترین چیزی که باعث شده اینقدر دنبال این مطلبایی که گفتم باشم اینه که زمان خدابیامرز VB6 خیالم راحت بود که پروژه ای که مینویسم قابل decode شدن نیست (البته منظور به خود VB است نه اسمبلی) اما الان میدونم که پروژه ای که مینویسم پس از کامپایل هم قابل برگشته (هر چند چه جوریشو نمیدونم) این بود که کلی دنبال یه چیزایی تو مایه های XenoCode برای 2005 بودم که با قیمت سرساماور اون و عدم وجود کرک کافی در دنیای اطلاعات، کلی غصه میخوردم. 
تا اینکه یه نفر از دور اومد (مثل زورو) و یه حرفی زد که این چراغ تو دلم روشن شد که شاید امیدی باشه با این حضرت ngen این کار رو انجام بدیم و به پروژه هامون امنیتی مثل VB6 اهدا نماییم (چقدر شبیه دساتانای رومانتیک شد!!) و این فرد کسی نبود جز شما
این بود داستان زندگی ما...  :-)
حالا اگه میشه "کمـــــــــــــــــــــــــــــــــــــــــــــ  ـــک!!!!"
یا به قول اون ور آبیا "Oh, Help meeeeee" 
یا به قول دریانوردا "SOS" 
یا به قول شیخ نشینا "سعدوووووونی!!" 
یا ....
:-)
و به قول خودم: ممنون میشم اگه راهنماییم کنید.

----------


## bahman.net

دستتون درد نکنه عالی بود

----------


## omid_Ahmadi

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

برگردیم سر بحثه خودمون. 

کار اصلی برنامه ی ngen این کاری که شما می خواهید  انجام بدید نیست. ngen یه فایل ساده است که با SDK مربوط به .NETFramework عرضه میشه. این برنامه یه فایل حاوی کد IL رو می گیره و یه فایل حاوی کد Native تولید می کنه (دقت کنید که این برنامه فقط محتویات فایل ورودی رو به کد نیتو تبدیل می کنه، نه محتویات فایلهایی که به وسیله ی این فایل reference شده اند و اسمشون توی metadata tables قرار گرفته). فرض کنیم شما این بلا رو سر یکی از DLL هایی که برای برنامه تون نوشتید در اوردید. حالا شما باید فایل خروجی ngen رو کنار فایل DLL اصلی در فولدر برنامه کپی کنید (و می تونید فایل DLL اصلی رو پاک کنید). پس تا حالا شما یه برنامه دارید که فرضا nتا فایل DLL داره که کلاسهای برنامه رو تشکیل میده که از این nتا فایل، یکی ش به کد نیتیو هست و n-1تاش به کد IL. حالا می تونید این فولدر برنامه رو ببرید و روی یه سیستم دیگه (فرضا سیستم مقصد) کپی کنید. در این حالت می دونید که کاربر می تونه با استفاده از برنامه های موجود کد همه ی فایلهای برنامه رو ببینه، به جز کد مربوط به فایل DLL ای که با استفاده از ngen به کد نیتیو تبدیل شده بود. دلیل این مورد هم مشخصه، چون اون فایل اصلا شامل کد IL نیست که بشه با Reflector ها روش کار کرد. اون فایل در حقیقت شامل Native Code هست. 

اما خوب اینجا میشه پرسید که مگه برای اجرای یه برنامه ی .NET نباید همه ی فایلها حاوی کد IL باشن؟
خوب نه، CLR یه قابلیتی داره برای ایجاد کامپتیبلیتی بین کدهای Managed و کدهای Unmanaged. مثلا بحثی رو که در تاپیک مربوط به استفاده از API در .NET لود رو که یادتونه. شما در اون برنامه ها با استفاده از .NET یه برنامه حاوی کد IL می نوشتید که می تونست یه تابع که حاوی کد نیتیو بود رو با استفاده از سیستمی به نام P/Invoke فراخوانی کنه. این سیستم یه نمونه از سازگاری بین کدهای managed و unmanaged به حساب میاد (راجع به نحوه ی انجام این کار دیگه توی این مقاله توضیح ندادم، چون حوصله شو نداشتم و فکر نمی کردم به درد کسی بخوره، اما اگه دوست داشتید می تونید کتابهای مربوط به خود پلت فرم .NET رو بخونید. توی اونها دقیق مراحل انجام این نوع کارها رو توضیح داده). 

در اجرای این برنامه هم CLR میاد بین برنامه ی اصلی شما و کدهای داخل این فایل DLL تولید شده به وسیله ی ngen، به وسیله ی همین سیستم هماهنگی ایجاد می کنه و به شما اجازه میده که بتونید از این دو در یک برنامه استفاده کنید.

اما خوب شما لازم دارید که این قضیه رو روی کل برنامه پیدا کنید. برای این کار باید اولا همه ی فایلهای برنامه رو به کد نیتیو تبدیل کنید، بعد فایل اصلی رو هم به صورتی تنظیم کنید که سیستم عامل قاطی نکنه، مثلا اون استاب 6 بایتی که باعث میشه موقع اجرای برنامه CLR اول اجرا بشه رو تنظیم کنید و یا ... که خوب مسلما برای این کار باید روی سیستم های مربوط به اجرای برنامه ها و فایلهای exe ی معمولی در ویندوز تسلط کامل داشته باشید، تفاوت اجرای برنامه های .NET رو در ویندوز ME به قبل و ویندوز 2000 و XP بدونید و کلی چیز دیگه.
خلاصه بگم که تقریبا این کار به صورت دستی برای یه برنامه نویس که به این مباحث تسلط نداره غیر ممکنه. پس این میشه جواب این سوالتون که چرا این قدر نرم افزارهایی مثلXenoCode طرفدار پیدا می کنن. 

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

اما خوب، حالا ناامید نشید. یه راه دیگم هست. فرض کنید در برنامه ی قبلی هر nتا فایل DLL رو با NGEN به کد نیتیو تبدیل کنید و بعدش یه فایل exe ی ساده (در حقیقت فقط شامل اینترفیس) با .NET بنویسید و بعد کل منطق برنامه رو توی اون nتا DLL قرار بدید. به این ترتیب می تونید با استفاده از اون سیستم هایی که گفتم و با استفاده از ngen (و بدون نیاز به نرم افزارهای اجنبی ها) نزارید که منطق برنامه تون لو بره. کد مربوط به دیزاین برنامه هم فکر نکنم اونقدر اهمیت داشته باشه و بتونید برای اون کدها به همون obfuscator ها اطمینان کنید. 

به این ترتیب می تونید این مشکلتون رو تقریبا برطرف کنید. زیاد هم سخت نیست.

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

راستی فکر کنم داستان زورو زیاد رمانتیک نبود (یا شاید هم بوده و قسمتهای رمانتیکش رو برای ما حذف کردن، چون بدآموزی داشته)!!!

----------


## Mahdi_Delphi

سلام خدمت اساتید گرامی
منم یه سری سوال برام مطرح شده که اگه لطف کنید و جواب بدین ممنون میشم.
1-آیا در دات نت وقتی مثلا از عکس استفاده میکنیم اون عکس جزء فایل exe برنامه میره و نیازی به کپی کردن اون در ماشین مقصد نیست؟(عجب سوال ضایعی !)

2- منظور دقیق از native code  چیه ؟ آیا منظور کد زبان ماشینه؟

3- منظور از active directory چیه ؟

خیلی ممنون

----------


## omid_Ahmadi

> -آیا در دات نت وقتی مثلا از عکس استفاده میکنیم اون عکس جزء فایل exe برنامه میره و نیازی به کپی کردن اون در ماشین مقصد نیست؟(عجب سوال ضایعی !)


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




> 2- منظور دقیق از native code چیه ؟ آیا منظور کد زبان ماشینه؟


آره، همون زبان ماشینه.




> منظور از active directory چیه ؟


ایضا این مورد هم ربطی به این تاپیک نداره، اما خوب می تونی سایت زیر رو ببینی:
http://msdn.microsoft.com/library/en...asp?frame=true

----------


## Mahdi_Delphi

خیلی ممنون

----------


## Mahdi_Delphi

با سلام  مجدد
در قسمتی از مقاله گفته شده که :
&#171;بعضی از برنامه نویسان عقیده دارند که زبان IL نمیتواند بطور کامل از الگوریتم هایی که آنها استفاده کرده اند محافظت کند.به عبارت دیگر به نظر آنها میتوان یک فایل حاوی کد مدیریت شده تولید کرد و سپس با استفاده از برنامه هایی که میتوانند کد IL را نمایش دهند مثل ildasm ومشاهده کد IL به الگوریتم برنامه دست پیدا کرد&#187;

حالا سوالی که اینجا برای من مطرح شده اینه که مگه همین کدهای IL به ماشین مقصد نمیرن؟
یعنی فایل اجرایی ما به صورت کد IL هست،پس چه لزومی داره یه Disassembler اونو برامون به IL تبدیل کنه تا ما بتونیم ببینیمش؟ مگه خودش به صورت عادی IL  و قابل دیدن نیست؟
و آیا ابزاری وجود داره که این کدهای IL رو به زبانهای سطح بالا (مثلا VB.NET یا #C) تبدیل کنه ؟

سوال دومم در مورد  obfuscate  کردن کد برنامه است.چه ابزارهایی برای این کار وجود داره ؟

ممنون

----------


## Mahdi_Delphi

یه سوال دیگه:
آیا میشه گفت CLR به عبارتی کد IL  رو تفسیر میکنه ؟
مثل مفسر بیسیک که کدهای بیسیک رو در زمان اجرا به کد زبان ماشین تبدیل میکنه.
اگه نمیشه اینطور گفت دلیلش چیه ؟
آخه با هر بار اجرای برنامه کامپایلر JIT کد IL رو به native code تبدیل میکنه.
**************************
راستی من نتیجه گیری کردم.ببینید درسته:
1- این که دات نت مستقل از سیستم عامل است به خاطر این است که کنترل اجرا و حافظه دهی و... به عهده فریم ورک (CLR) است.

2- این که دات نت مستقل از پردازنده است به خاطر این است که ابتدا به IL تبدیل میشود وسپس به کامپایلر JIT به کد زبان ماشین تبدیل میشود.

3- اینکه برنامه های دات نت نیاز به پکیج شدن و نصب نداره به خاطر این است که اسمبلی ها با استفاده از متادیتاها و manifest اطلاعات کاملی از خود و ریسورسها در خود دارد.

ممنون

----------


## omid_Ahmadi

> حالا سوالی که اینجا برای من مطرح شده اینه که مگه همین کدهای IL به ماشین مقصد نمیرن؟
> یعنی فایل اجرایی ما به صورت کد IL هست،پس چه لزومی داره یه Disassembler اونو برامون به IL تبدیل کنه تا ما بتونیم ببینیمش؟ مگه خودش به صورت عادی IL و قابل دیدن نیست؟


ببینم،مگه فایلهای exe که حاوی کد زبان ماشین هستن و روی سیستم شما وجود دارن به صورت عادی قابل دیدن هستن؟ یعنی می تونی کد اسمبلی اونها رو بدون استفاده از هیچ ادیتور خاصی ببینی؟ خوب IL هم به همین صورته دیگه.




> و آیا ابزاری وجود داره که این کدهای IL رو به زبانهای سطح بالا (مثلا VB.NET یا #C) تبدیل کنه ؟


بله وجود داره. یکی از دوستان یه برنامه ی Reflector توی یه تاپیک دیگه معرفی کرده بود که این کار رو می کرد.




> سوال دومم در مورد obfuscate کردن کد برنامه است.چه ابزارهایی برای این کار وجود داره ؟


این ابزار هم توی تاپیک های دیگه معرفی شده بود. فکر کنم یکی از اونها که آقای زواری معرفی کرد، واسه RemoteSoft بود. یه سری به سایتش بزن پیدا می کنی. فکر کنم آدرسش www.RemoteSoft.com بود.




> آیا میشه گفت CLR به عبارتی کد IL رو تفسیر میکنه ؟
> مثل مفسر بیسیک که کدهای بیسیک رو در زمان اجرا به کد زبان ماشین تبدیل میکنه.
> اگه نمیشه اینطور گفت دلیلش چیه ؟
> آخه با هر بار اجرای برنامه کامپایلر JIT کد IL رو به native code تبدیل میکنه.


نه، نمیشه گفت چون چند تا تفاوت اساسی بین این دو وجود داره که توی مقاله هم به اونها اشاره شده (البته نه صراحتا). ببین خودت می تونی متوجه بشی.

نتیجه گیری هات هم تقریبا درستند.
موفق باشی.

----------


## Mahdi_Delphi

خیلی ممنون بابت توضیحاتتون
در مورد سوال اول و دوم میخواستم به این نتیجه برسم که تا زمانی که Reflector ها وجود دارند،Disassebler ها خطر جدی مطرح نمیشن.یعنی تا وقتی یه Reflector مونده چه لزومی داره بریم سراغ DASM ؟
یه سوال دارم که شاید خیلی مسخره باشه(اما.....):
راستی چرا به این زبانها میگن دات نت (NET.) ؟؟؟




> چند تا تفاوت اساسی بین این دو وجود داره که توی مقاله هم به اونها اشاره شده (البته نه صراحتا). ببین خودت می تونی متوجه بشی.


سعی خودم رو میکنم.
ممنون و خدانگهدار

----------


## omid_Ahmadi

> در مورد سوال اول و دوم میخواستم به این نتیجه برسم که تا زمانی که Reflector ها وجود دارند،Disassebler ها خطر جدی مطرح نمیشن.یعنی تا وقتی یه Reflector مونده چه لزومی داره بریم سراغ DASM ؟


خوب اگر reflector ها هم وجود نداشته باشن، با ابزارهایی مثل DASM هم میشه یه مقدار خیلی کمی کار رو از پیش برد، اما خوب حالا دیگه reflector هم هست و دیگه چه بهتر.




> راستی چرا به این زبانها میگن دات نت (NET.) ؟؟؟


چون فلسفه ی به وجود اومدن چنین سیستمی، استفاده در محیط های تحت شبکه و طراحی سلوشن هایی در این زمینه بوده.

----------


## niloufar

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

حالا یه چیزی (هر چند نمیدونم دوباره کی وقت میکنم جوابشو بخونم):
اگه Dll ها رو Native کنیم و خود Exe به صورت IL بمونه، دیگه لازم نیست کاری برای هماهنگی بین اینا انجام بدیم، خودشون کنار هم عین زمانی که همشون IL بودن کار میکنن؟

بازم ممنون

----------


## niloufar

سلام
آقای احمدی
شما هم فکر کنم مثل من دیر به دیر دیگه سر میزنید.

----------


## omid_Ahmadi

نه، آخه دفعه ی قبل دو هفته طول کشید تا پست رو ببینید، این دفعه هم من گفتم حتما دو هفته وقت دارم، اما خوب شما روال رو به هم زدید و زودتر اومدید! :)
شوخی کردم، بگذریم. 
در تئوری این مورد کاملا امکان پذیره، اما در عمل ممکنه به علت اشتباهات ریزی که انجام بدید یه مشکلاتی براتون پیش بیاد. شما این کار رو تست کنید، اگر مشکلی پیش اومد سعی می کنیم که برطرفش کنیم.

موفق باشید.

----------


## niloufar

سلام
ممنون
هر وقت مشکلی پیش اومد مزاحمتون میشم

----------


## Ali_Mor

با سلام
واقعا مقاله جالبی بود. دست شما درد نکند.
بنده که خیلی چیزها یاد گرفتم.

----------


## ESG_Esfahan

سلام
آقای احمدی و Niloufar از شما ممنونم بحث جالبی انجام دادین.
یه سوال هم دارم . فایل NGEN.EXE را کجا پیداش کنم آیا همراه با برنامه Vs نصب میشه یا باید از سی دی نصب برنامه گرفتش؟ و اینکه این فایل در نسخه 2003 و 2005 فرقی داره یا نه ؟

----------


## omid_Ahmadi

این فایل همراه با SDK مربوط به .NET نصب میشه و هر نسخه از SDK رو هم که نصب کنید فایل موجود در اون می تونه با برنامه هایی که با کامپایلرهای موجود در اون SDK ایجاد شدن کار کنه.

----------


## ESG_Esfahan

خیلی ممنون .
بحث جالب و آموزنده ای بود.

----------


## ahmad_jahangir

salam man baraye avalin bar varede in site shodam omidvaram ke betonim ba ham dorane khob va mofid az etelaat dashte bashim  :تشویق:  :چشمک:

----------


## mmb.prog

ممنون از زحمات شما دوستان

----------


## samanehtajikfar

سلام 1 سوال تفاوت ها و شباهت های CLRو JVM nv در چیست؟

----------


## MaryamEsmailzadeh

آقای احمدی عزیز واقعا ممنونم ازتون
خیلی مفید بود

----------


## Hossein_HR

*سلام 

یه توضیح کلی در مورد JIT میخوام، ممنون*

----------


## eshpilen

میدونم تاپیک قدیمی هست، اما بنده هم مثل کاربر بالایی اخیرا دیدمش و PDF رو دانلود کردم و خوندم.
اول تشکر بابت مقاله.
دوم اینکه اتفاقا بنده تازگی تاپیکی تحت این عنوان داشتم که                       کدهای خروجی از JIT کجا ذخیره میشن؟
در اون تاپیک جواب این سوال مشخص نشد.
اما در مقاله ای که در پست اول این تاپیک ارائه شده چیزهایی گفته شده که فکر میکنم ما رو به جواب این سوال نزدیکتر میکنه.
در مقاله به این اشاره شده که دات نت هر بار که یک برنامهء دات نت اجرا میشه اون رو کامپایل میکنه و کدهای اجرایی Native در حافظه ذخیره میشن.
بنابراین میتونیم بگیم این کدها هرگز جایی (در هارد دیسک) برای اجراهای بعدی برنامه ذخیره نمیشن.

اگر این درست باشه، اولا این سوال پیش میاد که چرا؟ یعنی چرا دات نت یک کار رو بصورت تکراری و با صرف هزینهء Run time انجام میده؟ آیا نمیشد کدهای Native تولید شده در جایی ذخیره بشن و در دفعات بعدی اجرای برنامه اگر محتویات برنامه تغییری نکرده بود دیگه نیازی به کامپایل مجدد نباشه؟ البته در خود مقاله هم میگه که میشه بوسیلهء ngen.exe کد Native رو تولید کرد و همراه برنامه قرار داد و اگر دات نت این کدهای کامپایل شده رو ببینه دیگه خودش کامپایل مجدد انجام نمیده. ولی چرا این روش رو خود دات نت بصورت خودکار بکار نمیبره؟

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

البته یک چیزی که بنظر بنده رسید این بود که شاید این کدها در جایی بصورت موقتی و حتی شاید در RAM و فقط تا وقتی که IIS درحال اجرا هست ذخیره میشن. ولی بهرحال اینهم صرفا یک حدس هست و ضمنا ذخیرهء نامحدود در حافظه بنظر چندان معقول نمیاد (بدیهتا بخاطر اشغال حافظه). بازم میشه حدسهای بیشتری رو در این ارتباط مطرح کرد و تعدادی الگوریتم و بهینه سازی درنظر گرفت. مثلا میشه گفت این کدها بدون استفاده تا زمان محدودی یا تا وقتی کمبود حافظه پیش نیامده در RAM ذخیره میشن. ولی به این شکل پس این گفته که صفحات ASP.NET فقط در دفهء اول اجرا کامپایل میشن و با تاخیر همراه هستن زیاد هم صحیح نیست. البته شایدم یه نسخه از کدهای خروجی JIT برای صفحات ASP.NET  روی هارد هم ذخیره میشه و بعدا موقع نیاز به حافظه لود میشه. بهرحال میخوایم بدونیم مکانیزم واقعا چطور هست و این ذخیره سازی و مکان اون کجاست و ضمنا چرا درمورد برنامه های غیر از برنامه های وب این کار انجام نمیشه.

ضمنا یه سوال دیگه اینکه آیا برای پیش‌کامپایل ASP.NET هم از ngen.exe استفاده میشه؟ و روشش رو اگر میتونید و ساده و مختصر هست لطفا توضیح بدید (ضروری هم نیست چون احتمالا با گوگل میشه براحتی پیداش کرد). راستی خود صفحات که حاوی تگهای ASP.NET و HTML (و احتمالا مقداری کد برنامه) هستن رو هم میشه پیش کامپایل کرد یا احتمالا منظور فقط فایلهای کد (Code behind) و کلاسها و اینطور چیزها بوده؟

----------


## icebpy_5118

مرسی خیلی خیلی مرسی

----------


## meisam3322

ممنون به خاطر فایل ، عالی بود

----------


## torajabdari

ممنون واقعا کمک بزرگی بود

----------


## inspirationn

ممنون  :تشویق:

----------

