السلام عليكــم ورحمـة الله وبركاتــه ،،
هل احتجت يوما إلى ترجمة الكود إلى برنامج تنفيذى وذلك باستخدام الكود؟؟
هل تعتقد أن هذه العملية صعبة؟؟
الحل بسيط وسهل جدا بإذن الله
توفر لك بيئة الدوت نت فئة رائعة جدا للتعامل مع الكومبايلر وهى Microsoft.VisualBasic.VBCodeProvider حيث يمكنك استخدام هذه الفئة لترجمة الكود إلى ملف تنفيذى بمنتهى السهولة وبالمثال يتضح المقال
لنفرض أن لدينا وحدة نمطية Module تحتوى على هذا الكود
Public Module EntryPointModule
Public Sub Main()
Microsoft.VisualBasic.MsgBox("Test compiling a VB code")
End Sub
End Moduleكما تلاحظون أن البرنامج يحتوى على إجراء وحيد وهو Main والذى هو نقطة الإدخال الخاصة بالبرنامج وكل ما يقوم به هذا الإجراء هو إظهار رسالة فقط للمستخدم
نريد الآن عن طريق الكود تحويل هذا الكود إلى ملف تنفيذى والذى من المفترض عند تنفيذه أن يظهر لنا الرسالة "Test compiling a VB code"
الكود الذى سيقوم بهذه العملية سيكون بهذا الشكل
Dim pr As New VBCodeProvider
Dim cp As New CompilerParameters
cp.GenerateExecutable = True
cp.GenerateInMemory = False
cp.IncludeDebugInformation = False
cp.CompilerOptions = "/target:winexe"
cp.TreatWarningsAsErrors = False
cp.OutputAssembly = "C\:main.exe"
Dim cr As CompilerResults = pr.CompileAssemblyFromFile(cp, "C\:main.vb")
If cr.Errors.Count > 0 Then
For Each er As CompilerError In cr.Errors
MsgBox(er.ErrorText)
Next
End If
قمنا أولا بإنشاء نسخة جديدة من الفئة VBCodeProvider وهى المسئولة عن ترجمة الكود ونسخة من الفئة CompilerParameters والتى تستخدم لتحديد طريقة ترجمة الكود حيث تحدد نوع الملف الناتج هل هو ملف تنفيذى أو مكتبة ربط كما تحدد الأيكونة الخاصة بالبرنامج الناتج وغير ذلك من الوظائف
ثم نبدأ بعد ذلك بتحديد طريقة الترجمة عن طريق بعض الخصائص يمكنك مراجعتها على MSDN لكن ما يهمنا هو الخاصية GenerateExecutable والتى قمنا بإسناد القيمة True لها لأننا نريد أن ننشئ ملف تنفيذى وليس مكتبة ربط والخاصية CompilerOptions وهى التى تحدد خيارات المعالج عند ترجمة الكود وفى هذا المثال استخدمنا فقط خيار نوع المشروع وأخبرنا المعالج أن يترجم المشروع على أنه برنامج تنفيذى ثم أخبرناه أن الملف الناتج يجب حفظه فى المسار C:\main.exe وأخيرا نقوم بعملية الترجمة الفعلية عن طريق استدعاء الوظيفة CompileAssemblyFromFile والتى تستقبل معاملين اثنين الأول هو الفئة التى تحتوى على معاملات المعالج والثانى الملف المراد ترجمته وبعد تنفيذ هذه الوظيفة فإن نتيجة عملية الترجمة قمنا بتخزينها داخل كائن من النوع CompilerResults حتى نتمكن من معرفة هل تمت العملية بنجاح أم لا وذلك عن طريق التحقق من عدد الأخطاء فإن كانت صفرا فإن العملية قد تمت بنجاح وإلا فإن العملية قد فشلت.
أتمنى أن يكون الدرس مفيداً وأى استفسار فأنا فى انتظاركم ,,
