Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Помогите!!! Добавлено: 16.11.05 01:22  

Автор вопроса:  Андрей | ICQ: 308646911 
Пишется программа для конструирования электрических схем (элементы И, ИЛИ, НЕ и т.д. но это не важно). Программа работает, но есть маленькая проблема... Для начала объясню принцип создания схемы:
1)создаются блоки, соединяются связями и т.д. и т.п.
2)вся эта графическая схема переводится на язык программмирования (vb)
3)далее компилируется и и выполняется.

Так вот, все вы видели (надеюсь) статью про динамическое выполнение кода на vbnet, суть проблемы в том как вытащить значение результата из этого кода который выполняется динамически в основную программу...

Я хотел бы решить эту проблему так, в основной программе создаётся переменная, её адрес передаю в код который выполняется динамически. А этот код должен записать результат расчёта в переменную хранящуюся по этому адресу.

Но возникают 2 вопроса:
1)Как передать значение адреса в этот динамически выполняемый код?
2)Как работать с указателями в VB.NET?
3)Может кто знает как решить эту проблему по другому?

------------------------

Плюс вопросик на досуг:
Схема представляется в виде 3х массивов и т.д. Все они связаны между собой: массив объектов, массив связей, массив точек объектов. Вопрос такой: как удалить объект из этой структуры (необходима корректировка всех элементов остальных массивов)
КТО захочет помочь по этому вопросу пишите на andrushka@inbox.ru опишу задачу поподробнее ...

Заранее всем спасибо!

Ответить

  Ответы Всего ответов: 3  

Номер ответа: 1
Автор ответа:
 Андрей



ICQ: 308646911 

Вопросов: 3
Ответов: 4
 Профиль | | #1 Добавлено: 16.11.05 01:32
Приведу пример кода основной программы и кода который выполняется динамичеки :

Public Sub Compile()
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 = STR_COMPILE
        ' а это собственно наш код из текст бокса

        ;Dim 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

        ;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

Это вы всё видели в соответствующей статье ... а динамически выполняющийся код может быть например таким

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 а значение как то передать в основную программу ...

Ответить

Номер ответа: 2
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #2 Добавлено: 16.11.05 02:07
3)Может кто знает как решить эту проблему по другому?

Создать в генерированной сборке функцию. Которую просто вызвать, сохранив её результат.

Ответить

Номер ответа: 3
Автор ответа:
 Андрей



ICQ: 308646911 

Вопросов: 3
Ответов: 4
 Профиль | | #3 Добавлено: 16.11.05 14:57
Со всем уважением но ты наверное сам понял что твой ответ ни о чём не говорит. Объясню:
1)Создать функцию в сборке никакой проблемы не составляет
2)НО! ты пишешь "просто вызвать, сохранив её результат". Вся суть моего вопроса и заключается в том что как и куда сохранить. Я не понимаю куда ты хочешь сохранять? В файл что ли? а потом после выполнения открывать его в основной программе что ли? это потеря в скорости ... не подходит. Сборка должна выполнятся непрерывно, а результат должен выводится на схему.
В качестве основы для графического интерфейса и так используется PictureBox, а он не особо быстр, как ты знаешь ...

Итого ещё разок:
Главный вопрос как передать указатель на переменную, которая должна содержать результат, в сборку, и как записать в эту переменную (зная указатель) значение результата

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам