تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
معلومة ::: أجعل المستخدم عبر تطبيقك يخرج برامج أخري - CodeDom
#1
كاتب الموضوع : BADRMEDIA



ربما رأيت فى بعض الأنظمة التى تعتمد على قاعدة بيانات SQL أن مصممي النظام أتاحوا لمدراء النظام أن يكتبوا أوامر T- SQL إلي قاعدة البيانات مباشرة – ويقوم بأعمال على النظام كأنه مصمم للنظام

وربما يقوم مصمم النظام بتصميم هذا الجزء له هو – حيث يذهب إلى متابعة نظامه فى شركة ما


لكن هل فكرت أن يقوم بتصميم جزء فى النظام – يتيح للمستخدم تصميم برنامج خاص به مباشرة

بحيث يكتب الكود ويتم تحويل هذا الكود لتطبيق !!!!!!!!!

هذا هو الجديد


يوجد فضاء اسم فى الدوت نت باسم CodeDom وهو المسئول عن ذلك

لنري مثال حي الان

===================================

افتح مشروع جديد Windows App

فى قسم فضاء الاسم أعلن عن هذا


كود :
Imports System.CodeDom
Imports System.CodeDom.Compiler
سنقوم لإنشاء إجراء هو المسئول عن العملية

نحتاج إلى اضافة NameSpace إلى الكود المنشأ وفضاء الاسم CodeDom بالفعل يمكن ذلك



كود :
Dim NameSpace_inCreateApp As New CodeNamespace("BADRMEDIA")

كما فى الكود أضفنا فضاء اسم باسم البرنامج الذى سننشأه الآن


كما يمكننا أن نضيف أى فضاء اسم أخربكل سهولة عبر Import

كود :
NameSpace_inCreateApp.Imports.Add(New CodeNamespaceImport("System"))

الكود يقول أنه سيتم اضافة فضاء اسم وهو System للكود الذى سيطبق

}}}
تم الشكر بواسطة:
#2
ماذا لو أردت أن تضيف للتطبيق الذى سينشأ - كلاس Class هل فكرت فى ذلك ؟؟؟



كود :
Dim Class_inCreateApp As New CodeTypeDeclaration("BADRMEDIA_Class")
Class_inCreateApp.IsClass = True
Class_inCreateApp.Attributes = MemberAttributes.Public Or MemberAttributes.Static
NameSpace_inCreateApp.Types.Add(Class_inCreateApp)
هنا أضفنا Class باسم BADRMEDIA_Class


ولكن لم يعرف البرنامج بعد أنه Class

لكن فى السطر الثاني أخبرناه أنه Class



كود :
Class_inCreateApp.IsClass = True

وبنفس الطريقة يمكن إنشاء IsInterface وغيرها من الأنواع


فى السطر الثاثل عرفنا نوع التعريف هل هو Static أم Public

وفي النهاية أضفنا الكلاس للمشروع الجديد



كود :
NameSpace_inCreateApp.Types.Add(Class_inCreateApp)


}}}
تم الشكر بواسطة:
#3

جاء دور أن نضيف Method للتطبيق المنشأ



كود :
Dim Method_inCreateApp As New CodeEntryPointMethod()
Method_inCreateApp.Attributes = MemberAttributes.Public Or MemberAttributes.Static
Method_inCreateApp.Statements.Add(New CodeSnippetStatement(TextBox1.Text))
Class_inCreateApp.Members.Add(Method_inCreateApp)

قمنا بانشاء Method باسم Method_inCreateApp ولو لاحظنا فى فى نوعه سنجد أنه CodeEntryPointMethod

وهذا يعنى أنه يعمل عمل الاجراء Main منطقة دخول البرنامج

ثم حددنا Attributes كما في السطر الثاني



فى التطبيق نحن نضيف TextBox وزر Button


في السطر الثالث


كود :
Method_inCreateApp.Statements.Add(New CodeSnippetStatement(TextBox1.Text
))


هذا أهم سطر فى الفكرة وهو أننا أخذنا الكود المكتوب في مربع النص TextBox بحيث ننفذه


وفى السطر الأخير قمنا بشئ اخر وهو أننا أضفنا Method_inCreateApp إلى الكلاس وليس الى فضاء الاسم لأن Method جزء من Class ثم الكلاس جزء من فضاء الاسم



كود :
Class_inCreateApp.Members.Add(Method_inCreateApp)

}}}
تم الشكر بواسطة:
#4
الآن سنقوم بعمل ترجمة للكود وتطبيقه



كود :
Dim Compile_inCreateApp As New CodeCompileUnit
Compile_inCreateApp.Namespaces.Add(NameSpace_inCreateApp)
Dim CompilingParams As New Compiler.CompilerParameters()
CompilingParams.ReferencedAssemblies.Add("system.dll")
CompilingParams.GenerateInMemory = False
CompilingParams.GenerateExecutable = True
CompilingParams.OutputAssembly = "c:\BADRMEDIA.exe"
Dim CodeProvider As New Microsoft.VisualBasic.VBCodeProvider
Dim Compiler As ICodeCompiler = CodeProvider.CreateCompiler
Dim CompilerResult As CompilerResults = Compiler.CompileAssemblyFromDom(CompilingParams, Compile_inCreateApp)

في أول الكود قمنا بانشاء CodeCompileUnit


كود :
Dim Compile_inCreateApp As New CodeCompileUnit
التى تقوم باعطاء معلومات عن التطبيق من خلال Method


ثم نضيف ذلك إلى فضاء الاسم


كود :
Compile_inCreateApp.Namespaces.Add(NameSpace_inCreateApp
)



ُثم أنشأنا عنصر نرسل له خصائص العنصر Compiler

كود :
Dim CompilingParams As New Compiler.CompilerParameters()



ثم أرسلنا ثلاث خصائص


كود :
CompilingParams.GenerateInMemory = False
CompilingParams.GenerateExecutable = True
CompilingParams.OutputAssembly = "c:\BADRMEDIA.exe"

الخاصية الأول أعطت الصلاحية للكومبيلر بعمل ال Generation فى الذاكرة

والخاصية الثانية اعطت له الصلاحية بعمل ملف تنفيذى

والثالثة أعطت مسار انشاء الملف واسمه



===================


أنشانا Complier


كود :
Dim Compiler As ICodeCompiler = CodeProvider.CreateCompiler

ثم سنمرر للكائن CompilerResults الخواص و Compiler

كود :
Dim CompilerResult As CompilerResults = Compiler.CompileAssemblyFromDom(CompilingParams, Compile_inCreateApp)
}}}
تم الشكر بواسطة:
#5

لقد قمنا فعلاً بالترجمة للمشروع - لكن كيف نصطاد الخطأ


كود :
If CompilerResult Is DBNull.Value Or CompilerResult.Errors.Count > 0 Then
For i As Integer = 0 To CompilerResult.Errors.Count - 1
MsgBox(CompilerResult.Errors(i).ToString)
Next
End If

الكود واضح وما يحتاج شرح


}}}
تم الشكر بواسطة:
#6
بالفعل أنهينا شرح الاجراء وسيكون شكله فى النهاية


كود :
Public Sub CreateApp()

Dim NameSpace_inCreateApp As New CodeNamespace("BADRMEDIA")
NameSpace_inCreateApp.Imports.Add(New CodeNamespaceImport("System"))

Dim Class_inCreateApp As New CodeTypeDeclaration("BADRMEDIA_Class")
Class_inCreateApp.IsClass = True
Class_inCreateApp.Attributes = MemberAttributes.Public Or MemberAttributes.Static
NameSpace_inCreateApp.Types.Add(Class_inCreateApp)

Dim Method_inCreateApp As New CodeEntryPointMethod()
Method_inCreateApp.Attributes = MemberAttributes.Public Or MemberAttributes.Static
Method_inCreateApp.Statements.Add(New CodeSnippetStatement(TextBox1.Text))
Class_inCreateApp.Members.Add(Method_inCreateApp)


Dim Compile_inCreateApp As New CodeCompileUnit
Compile_inCreateApp.Namespaces.Add(NameSpace_inCreateApp)
Dim CompilingParams As New Compiler.CompilerParameters()
CompilingParams.ReferencedAssemblies.Add("system.dll")
CompilingParams.GenerateInMemory = False
CompilingParams.GenerateExecutable = True
CompilingParams.OutputAssembly = "c:\BADRMEDIA.exe"
Dim CodeProvider As New Microsoft.VisualBasic.VBCodeProvider
Dim Compiler As ICodeCompiler = CodeProvider.CreateCompiler
Dim CompilerResult As CompilerResults = Compiler.CompileAssemblyFromDom(CompilingParams, Compile_inCreateApp)


If CompilerResult Is DBNull.Value Or CompilerResult.Errors.Count > 0 Then
For i As Integer = 0 To CompilerResult.Errors.Count - 1
MsgBox(CompilerResult.Errors(i).ToString)
Next
End If

End Sub


وتحت حدث الزر Button نكتب هذا الكود

كود :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
CreateApp()
Shell("c:\BADRMEDIA.exe", AppWinStyle.NormalFocus)
End Sub


بالنسبة لكود المستخدم كمثال :


اكتب فى مربع النص هذا الكود


كود :
console.writeline("www.vb4arab.com")
for i as integer = 0 to 5
console.writeline("www.BADRMEDIA.com")
next
console.readline()



}}}
تم الشكر بواسطة:
#7
حمل مثال مايكروسوفت


http://msdn2.microsoft.com/en-us/lib...1t(VS.80).aspx

}}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم