Страница: 1 |
|
Вопрос: Помогите!!!
|
Добавлено: 16.11.05 01:22
|
|
Автор вопроса: Андрей | ICQ: 308646911
|
Пишется программа для конструирования электрических схем (элементы И, ИЛИ, НЕ и т.д. но это не важно). Программа работает, но есть маленькая проблема... Для начала объясню принцип создания схемы:
1)создаются блоки, соединяются связями и т.д. и т.п.
2)вся эта графическая схема переводится на язык программмирования (vb)
3)далее компилируется и и выполняется.
Так вот, все вы видели (надеюсь) статью про динамическое выполнение кода на vbnet, суть проблемы в том как вытащить значение результата из этого кода который выполняется динамически в основную программу...
Я хотел бы решить эту проблему так, в основной программе создаётся переменная, её адрес передаю в код который выполняется динамически. А этот код должен записать результат расчёта в переменную хранящуюся по этому адресу.
Но возникают 2 вопроса:
1)Как передать значение адреса в этот динамически выполняемый код?
2)Как работать с указателями в VB.NET?
3)Может кто знает как решить эту проблему по другому?
------------------------
Плюс вопросик на досуг:
Схема представляется в виде 3х массивов и т.д. Все они связаны между собой: массив объектов, массив связей, массив точек объектов. Вопрос такой: как удалить объект из этой структуры (необходима корректировка всех элементов остальных массивов)
КТО захочет помочь по этому вопросу пишите на andrushka@inbox.ru опишу задачу поподробнее ...
Заранее всем спасибо!
Ответить
|
Номер ответа: 1 Автор ответа: Андрей
ICQ: 308646911
Вопросов: 3 Ответов: 4
|
Профиль | | #1
|
Добавлено: 16.11.05 01:32
|
Приведу пример кода основной программы и кода который выполняется динамичеки :
Public Sub Compile()
Dim objCodeCompiler As System.CodeDom.Compiler.ICodeCompiler = New VBCodeProvider().CreateCompiler ' создали объект нашего компилятора
 im 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
' а также укажем что это все надо генерировать в памяти
 im strCode As String = STR_COMPILE
' а это собственно наш код из текст бокса
 im objCompileResults As System.CodeDom.Compiler.CompilerResults = _
objCodeCompiler.CompileAssemblyFromSource(objCompilerParameters, strCode)
' попытаемся скомпилировать все это дело
If objCompileResults.Errors.HasErrors Then
' если присутствуют какие-либо ошибки
MsgBox("Error: Line>" & objCompileResults.Errors(0).Line.ToString & ", " & objCompileResults.Errors(0).ErrorText)
Exit Sub
End If
 im objAssembly As System.Reflection.Assembly = objCompileResults.CompiledAssembly
' создаем сборку
' выполнение программы начнется с класса MainClass
 im 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
Это вы всё видели в соответствующей статье ... а динамически выполняющийся код может быть например таким
Imports System.Windows.Forms
Public Class MainClass
public output as integer
Public x as integer = 1
Public y as integer = 0
Public function ILI_NE(x1 as integer,x2 as integer) as integer
dim tmp as integer
if x1 = 0 and x2 = 0 then
tmp = 0
else
tmp = 1
end if
if tmp = 1 then
tmp = 0
else
tmp = 1
end if
return tmp
End Function
Public Function ExecuteCode()
output = ILI_NE(x,y)
MessageBox.Show(output)
End Function
Программа выводит результат в messagebox а значение как то передать в основную программу ...
Ответить
|
Страница: 1 |
Поиск по форуму