Динамічне виконання коду в VB.Net

Введення


Я думаю всім програмістам, які займаються одночасно і підтримкою користувачів, знайома ситуація коли юзери підходять і просять додати до програми таку фічу, щоб вони могли самі дописувати шматки до вихідної програмі. Не вистачає іноді їм, бачте, вбудованої функціональності. Не знаю як вам, але мене вже дістали! Тільки прийдеш на роботу, відразу зграйками підбігають і просять, щоб що-небудь таке приробив до програми:

Ніколи не думав, але виявляється Microsoft зробила таку фічу! І тепер кожен юзер може своїми власними руками писати різні добавки, і вони можуть виконуватися прямо з програми.

Створення додатка


Для створення програми яке може динамічно виконувати код нам буде потрібно всього нічого:


Тепер залишилося додати обробник на натискання кнопки, ніж ми власне і займемося:





 Private Sub Button1_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button1.Click
Dim objCodeCompiler As System.CodeDom.Compiler.ICodeCompiler = New _
VBCodeProvider (). CreateCompiler "створили об'єкт нашого компілятора

Dim objCompilerParameters As New System.CodeDom.Compiler.CompilerParameters ()
"А це параметри до нього (щось типу imports, можна звичайно і без цього,
"Але тоді це все доведеться дописувати до програми самому користувачеві)
objCompilerParameters.ReferencedAssemblies.Add(“System.dll”)
objCompilerParameters.ReferencedAssemblies.Add ("System.Windows.Forms.dll")
objCompilerParameters.ReferencedAssemblies.Add ("Microsoft.VisualBasic.dll")
"Додали потрібні нам посилання
objCompilerParameters.GenerateInMemory = True
"А також вкажемо що це все треба генерувати в пам'яті

Dim strCode As String = TextBox1.Text
"А це власне наш код з текст боксу

Dim objCompileResults As System.CodeDom.Compiler.CompilerResults = _
objCodeCompiler.CompileAssemblyFromSource (objCompilerParameters, strCode)
"Спробуємо скомпілювати все це справа
If objCompileResults.Errors.HasErrors Then
"Якщо присутні будь-які помилки виведемо користувачеві перше
"Можна б було і все загнати в якій-небудь listbox але було лінь …
MsgBox ("Error: Line>" & objCompileResults.Errors (0). Line.ToString & "," & _
objCompileResults.Errors(0).ErrorText)
Exit Sub
End If

Dim objAssembly As System.Reflection.Assembly = objCompileResults.CompiledAssembly
"Створюємо збірку
"Виконання програми почнеться з класу MainClass
Dim objTheClass As Object = objAssembly.CreateInstance ("MainClass") If objTheClass _
Is Nothing Then
"Якщо такого класу немає, то на жаль …
MsgBox(“Can”t load class…”)
Exit Sub
End If
"А от якщо він є те викликаємо його метод ExecuteCode і вперед …
Try
objTheClass.GetType.InvokeMember(“ExecuteCode”,
System.Reflection.BindingFlags.InvokeMethod, _
Nothing, objTheClass, Nothing)
Catch ex As Exception
MsgBox(“Error:” & ex.Message)
End Try
End Sub


Ось власне і вся наша програма. Функціональність звичайно мінімальна, але далі і самі розберетеся:

Написання виконуваного коду


І остання частина нашої роботи, відповідно, створення додатка, що ми потім помістимо в Textbox. Зробимо все по мінімуму:





Imports System.Windows.Forms

Public Class MainClass
Public Function ExecuteCode()
Dim objTest As New TestClass()
MessageBox.Show(objTest.Test)
End Function
End Class

Public Class TestClass
Public Function Test()
Return "Працює!"
End Function
End Class


Тут, як кажуть, коментарі зайві …


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*