Динамічне виконання коду в 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>

*

*