فرک کنم همه بودنید که فریم ورک .NET فقط شامل یه سری DLL نیست که چند تا کلاس توش باشه. مهمترین قسمت فریم ورک CLR اه که مسئوله اجرای برنامه هاییه که تحت .NET نوشته می شن. تا CLR در کامپیوتر مقصد نباشه، برنامه های نوشته شده با .NET نمی تونن اجرا بشن. چون برنامه های .NET به کد IL تبدیل میشن نه به Native پس قبل از اجرا به JIT نیاز دارن تا بتونه اونها رو به کد Native تبدیل کنه.
برای اینکه بفهمیم در یه برنامه ای که با .NET نوشته شده از چه DLL هایی استفاده شده می تونیم namespace هایی که در برنامه از اون استفاده شده رو توی MSDN پیدا کنیم و ببینیم که این Namespace در چه فایل اسمبلی قرار گرفته. بعدش اوون فایل اسمبلی رو توی آدرس زیر پیدا کنیم البته از اسم namespace هم میشه فهمید که در چه اسمبلی قرار داره(البته برای دسترسی به این فولدر ها باید از Command استفاده کنید چون خود ویندوز اجازه نمیده که به این فولدر ها دسترسی داشته باشید و میگه که انها وجود ندارند).
C:\Windows\Assembly
مثلا برنامه ای که به این صورت تعریف شده باشه:
using System;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
از DLLهای زیر استفاده کرده:
System.Dll در آدرس
C:\WINDOWS\assembly\GAC_MSIL\System\2.0.0.0__b77a5 c561934e089
System.Drawing.Dll در آدرس
C:\WINDOWS\assembly\GAC_MSIL\System.Drawing\2.0.0. 0__b03f5f7f11d50a3a
System.Windows.Forms در آدرس
C:\WINDOWS\assembly\GAC_MSIL\System.Windows.Forms\ 2.0.0.0__b77a5c561934e089
System.Data در آدرس
C:\WINDOWS\assembly\GAC_32\System.Data\2.0.0.0__b7 7a5c561934e089
System.Text هم در آدرس مربوط به System.dll است.
تمام کلاسهایی که در این DLL ها وجود دارن به صورت IL هستن و قبل از اجرا شدن باید با استفاده از JIT به کد NAtive تبدیل بشن. البته میشه کاری کرد که به JIT احتیاجی نداشته باشن و اون هم اینکه که با ابزاری مثل ngen.exe اوون ها رو به کد native تبدیل کرده و توکامپیوتر save کنیم. این جوری وقتی CLR ببینه که کد native اوونها وجود داره دیگه نمیره از کد IL اونها استفاده کنه.
مشکل دیگه ای که وقتی بخواهیم برنامه بدون نصب شدن فریم ورک اجرا بشه به وجود می یاد اینه که باید ساختار فایل exe ی برنامه رو هم یه تغییراتی توش بدیم.
فایل exe ای که به وسیله ی کامپایلر C# برای یه برنامه ایجاد میشه، ساختارش شبیه فایل exe عادی است. اما در ابتدای اون فایل یعنی توی بخش .text یه دستور اسمبلی به صورت زیر اضافه می شه:
JMP _CorExeMain
این متد توی فایل MSCorEE.dll توی آدرس system32 است. پس یه ریفرنس به این فایل هم توی بخش .idata اضافه می شه. وقتی ویندوز بخواد این فایل رو اجرا کنه میره فایل mscoree.dll رو لود می کنه که متد CorExeMain رو کال کنه، این متد هم اگر تا حالا CLR اجرا نشده باشه، اوون رو اجرا می کنه تا CLR بیاد و کنترل برنامه رو بدست بگیره و فایل رو اجرا کنه.
خوب، پس برای اینکه یه برنامه رو بخواهیم بدون .NET اجرا کنیم باید کاری کنیم که به CLR نیازی نداشته باشه، بعد هم فایل رو به صورتی تغییر بدیم که دیگه نخواد متد _CorExeMain رو کال کنه. البته فکر کنم با تبدیل فایل با ngen.exe به کد native این قسمت درست بشه.
پس اول باید اون رو به کد native تبدیل کنیم که دیگه JIT نخواد. بعدش هم ساختار فایلی که کامپایلر میسازه رو به صورتی تغییر بدیم که یه ریفرنس از dll هایی که توش از اونها استفاده کردیم به ابتدای فایل اضافه بشه. (البته روش این یکی رو هیچی راجع بهش نمی دونم. اگه کسی از دوستان می دونه بگه. چون من فقط یه کم ساختار فایلهای .net رو بلدم و از ساختار exe های عادی چیزی نمی دونم)
تازه با همه ی این تفاصیل، اگر هم بتونیم این کار رو بکنیم، یعنی CLR رو کامل کنار زدیم پس از تمام امکاناتی که داره هم مثل GC، SideBySide Execution و ... نمی تونیم استفاده کنیم.
به خاطر همین فکر نکنم درست باشه کاری کنیم که یه برنامه بدون .NET اجرا بشه (البته اگر شدنی باشه).
موفق باشید.