Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11656
Последний выпуск: 19.06.2015

Динамическое выполнение кода

Николай Белоусов
Источник: www.vbstreets.ru

В статье рассказывается о возможность динамического выполнения кода непосредственно из приложения на VB.NET.

Введение

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

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

Создание приложения

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

  • Textbox - там собственно и будет располагаться текст программы (не забудьте поставить Multiline и Scrollbars)
  • Button - а это собственно для выполнения кода

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

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

Тут, как говорится, комментарии излишни...

Заключение

Если кому-то лень проделывать описанные выше операции самому можете воспользоваться примером.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
29K
09 мая 2007 года
GoodWin92
0 / / 09.05.2007
Мне нравитсяМне не нравится
9 мая 2007, 19:56:20
s 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
[\code]

Здесь вообще почти все в ошибках у меня Visual Studio
2.
29K
09 мая 2007 года
GoodWin92
0 / / 09.05.2007
Мне нравитсяМне не нравится
9 мая 2007, 19:46:33
у меня на objTheClass выдает ошибку
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог