سلام استاد علی
1- اینکه کد ها در سی شارپ مدیریت شده هستند به چه معناست؟ یعنی از چه لحاظ مدیریت شده هستند؟ و همین طور کدهای Unmanaged از چه لحاظ مدیریت نشده هستند؟
منظور از مدیریت شده معنای تحت کنترل بودنه. یک ماشین مجازی برای اجرای برنامه های NET. هست که هر چیزی که مربوط به اجرای داخل خودشه از محیط بیرون ماشین مجازی دور نگه میداره. ماشین مجازی روی کدی که بیرون از محیط خودش اجرا میشه کنترل نداره. اون چیزی که داخل محیط ماشین مجازی قرار گرفته تحت کنترلش قرار داره و Managed ئه و هر آنچه داخلش نیست، تحت کنترل اش قرار نداره و Unmanaged ئه. فرضا اون حافظه ای که برای متغیر #C استفاده می کنید تحت کنترل ئه و Managed ئه و اون حافظه ای که برای اجرا کردن یک دستور API ویندوز یا یک برنامه خارجی مثل ماشین حساب ویندوز بکار میره، تحت کنترل اش نیست و Unmanaged ئه.
2- شما فرمودین ما می تونیم بین محیط Managed و Unmanaged ارتباط برقرار کنیم ولی کد Managed همون Managed می مونه. دو سوال:
الف- در جمله بالا واژه محیط درست تره یا کد
ب- آیا همون طور که کد Managed به Unmanaged تبدیل نمی شه بر عکسش هم درسته؟
هر دو درسته، چون بهر حال کد Managed داخل محیط Managed قرار داره و کد Unmanaged در محیط Unmanaged، ولی ارتباط بین دو محیط مفهوم تره تا ارتباط بین دو تا کد.
تبدیل نمیشه، چون اجرا کننده اش تغییر نمی کنه، کد Managed همیشه Managed میمونه چون اجرا کننده اش ماشین مجازیه و کد Unmanaged هم همیشه Unmanaged میمونه چون اجرا کننده اش ماشین مجازی نیست. غیر از این هم نمیتونه باشه چون اصلا ماشین مجازی جز کد ماشین مخصوص خودش چیز دیگری رو متوجه نمیشه که بخواد اجرا کنه.
3- طبق آموزش ها ما نمی تونیم همه dll های Unmanaged رو وارد سی شارپ کنیم. حالا اون dll هایی که می تونیم وارد سی شارپ کنیم باید چه ویژگی هایی داشته باشند یا از چه زبانی باشند که بتونیم وارد سی شارپ کنیم.
وارد کردن رو به یک شیوه خاص محدود کردید که مختص یک گروه خاص از کتابخانه ها است و به همون جهت میگید برای بقیه گروه ها که با اون روش سازگار نیستند نمی توانیم واردش کنیم. من نمیدونم منظورتون کدوم آموزش و به چه شیوه ای است اما به هر حال کتابخانه dll حتی اگه بصورت مستقیم توسط کد #C تون قابل استفاده نباشه با استفاده از یک کد واسطه قابل استفاده است. مهمتر اینه که ببینید قراره با اون dll چه کاری انجام بدید.
کلا شما می توانید از همه کتابخانه های dll بالاخره به روشی استفاده ای بکنید اما نه به یک روش ثابت که برای همه کتابخانه ها جواب بده.
زبان مبدا مهم نیست، کامپایلر مبدا مهمه، این دو تا با هم فرق دارند، فرضا ممکنه زبان مبدا ++C باشه ولی دو تا کامپایلر ++C متفاوت از روی یک کد ++C کتابخانه های dll متفاوتی بسازند که تفاوت های زیادی با هم دارند، همونطور که ویژوال استدیو های قدیمی با ویژوال استدیو های جدید از این نظر فرق دارند.
4- وقتی یک پروژه رو کامپایل می کنیم فقط به فایل های exe و dll تبدیل میشن یا به فایل های دیگه ای هم تبدیل میشن. اگه میشن پسوندشون چی هست؟ و اینکه درست اینه که بگیم پروژه کامپایل می شه یا Solution
پسوند اینجا خیلی تعیین کننده نیست، داخلشون مطرحه. dll از نظر داخلی شباهت زیادی به exe داره چون هر دو فایل اجرایی هستند، حتی بعضی از exe ها بصورت کتابخانه dll هم استفاده می شوند، نباید روی پسوند متمرکز بشید.
نهایتا کد کامپایل میشه، وقتی پروژه رو کامپایل می کنید کد های داخل پروژه رو کامپایل کردید، وقتی Solution رو کامپایل می کنید همه کد های داخل پروژه های درون اون Solution رو کامپایل می کنید. چیزی اینجا اشتباه یا بهتر و بدتر نیست.
5- ما می تونیم در یک Solution که یک پروژه ایجاد کردیم به هر تعداد ممکن Form ایجاد کنیم و روی این فرم ها کنترل های مختلف. حالا اگه می تونیم پس چه نیازی به ایجاد دو یا چند پروژه در یک Solution هست؟ اگه می شه یک نرم افزار مثال بزنید که شامل چندین پروژه باشه و هر پروژه شامل چندین فرم. اگه چنین برنامه ای هست نمی شه با یک پروژه درستش کرد؟
حداقل سه تا کاربرد مهم در این قضیه چند پروژه ای بودن Soluton هست.
درسته که شما در یک پروژه چندین فرم می سازید، ولی کل پروژه شما فقط از یک نوع خاص ئه و کل اش با تنظیمات کامپایل مخصوص اون پروژه کامپایل میشه و این برای پروژه های بزرگ یا چند قسمتی محدودیته.
فرضا شما دارید یک کتابخانه میسازید که فرضا کارش رسم کردن نمودار ئه. خود این پروژه باید از نوع کتابخانه باشه، ولی موقع کد نویسی و برای تست کردن کدتون کتابخانه کافی نیست و نیاز به یک پروژه عادی ویندوز هم دارید که بتوانید کتابخانه تون رو داخلش وارد کنید و اجراشو بررسی کنید. این چیزی نیست که فقط در یک پروژه قابل اجرا باشه، چون پروژه یا باید کتابخانه باشه یا کتابخانه نباشه. اینجا شما در Solution تون دو تا پروژه قرار میدهید، یکی اش اون کتابخانه تون و دیگری یک پروژه عادی برای آزمون اون کتابخانه که پروژه کتابخانه رو هم داخلش به عنوان Reference اضافه می کنید و همینطور که کد کتابخانه تون کامل میشه، استفاده عملی شو تست می کنید.
از طرف دیگه یک پروژه، هر چی که هست، مستقل از پروژه دیگری کامپایل میشه. یعنی اگر شما دو پروژه با صد ها کلاس داخلشون داشته باشید و کد یکی از کلاس ها تغییر کنه، موقع کامپایل شدن این Solution فقط نیازه اون پروژه ای مجدد کامپایل بشه که کلاس داخلش قرار داشت و اون یکی پروژه همونطور که هست و بدون نیاز به کامپایل مجدد میمونه. اینطوری و با تقسیم پروژه های بزرگ به چندین قسمت زمان کامپایل در پروژه های بزرگ بصورت محسوسی پایین میاد.
از طرف دیگه یک پروژه شما ممکنه کتابخانه ای باشه که در چندین برنامه متفاوت شما استفاده بشه و بخواهید به تدریج که به ایرادات و نواقصش پی میبرید، تکمیلش هم بکنید. اگر کل کتابخانه تون رو بصورت پروژه در Solution های متفاوت تون وارد کنید، می توانید خیلی ساده و بدون اینکه از پروژه کتابخانه تون کپی بگیرید، در چندین جا ازش استفاده کنید و هر ویرایش و بهبود و رفع خطایی که یکبار رویش انجام بدید برای سایر Solution ها هم اعمال میشه.