Страница: 1 |
Страница: 1 |
Вопрос: Рантаймная компиляция кода
Добавлено: 09.07.06 19:00
Автор вопроса: Sacred Phoenix | ICQ: 304238252
есть такая фича (смотреть здесь: sacredphoenix.nm.ru/temp.rar), которую мона юзать как скрипты в своих приложениях. Можно ли получить в основную программу рез-ты работы "скрипта" и передать в него что-нить? Если да, то как?
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
ПтирЯ
Вопросов: 11
Ответов: 71
Профиль | | #1
Добавлено: 10.07.06 12:50
Генеришь класс с нужной тебе функцией, компиляешь, и вызываешь.
Номер ответа: 2
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #2
Добавлено: 10.07.06 18:10
ну блин, генерю класс с нужной функцией, в которой, например, объявляю переменную A. Вопрос в том, как получить значение этой переменной из основной программы! Что тут может быть непонятно?
Ну или ты не смотрел архив и сразу отвечаешь
Номер ответа: 3
Автор ответа:
ПтирЯ
Вопросов: 11
Ответов: 71
Профиль | | #3
Добавлено: 11.07.06 09:28
Как можно получить значение внутренней переменной функции?
1) возвратить ее как результат работы функции
2) объявить параметром функции/процедуры переменную ByRef и в нее присвоить значение
Вот применяя эти сведения и надо генерить функцию. и потом вызывать
Номер ответа: 4
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #4
Добавлено: 11.07.06 12:37
допустим переменная не внутренняя. Я, например, генерю такой класс:
Public Class Main
Public MyVar As System.Int32
Public Sub Main
'// здесь мы чё-нить делаем с переменной, например:
MyVar = 64
End Sub
End Class
как получить значение переменной из моей проги, которая генерила класс и вызывала проц. Main?
и можно ли передать в сгенеренный класс объект-форму проги?
Номер ответа: 5
Автор ответа:
ПтирЯ
Вопросов: 11
Ответов: 71
Профиль | | #5
Добавлено: 11.07.06 14:28
Тогда ты сможешь получить значение твоей MyVar
вот так
Dim objTheClass As Object = objAssembly.CreateInstance("Main", True)
objTheClass.GetType.InvokeMember("Main", System.Reflection.BindingFlags.InvokeMethod, Nothing, objTheClass, Nothing)
Dim Res as String = objTheClass.MyVar '(так как она у тебя Public в классе Main)
Номер ответа: 6
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #6
Добавлено: 12.07.06 00:19
мне кажется такой вариант не прокатит, так objTheClass объявлен как As Object, и соответственно он понятия не имеет о существовании MyVar
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 12.07.06 00:25
Option Strict On
Imports System.IO
Imports System.Reflection
Imports System.CodeDom.Compiler
Public Class Form1
Private assemblyPath As String = Path.Combine(Application.StartupPath, "RunTime.dll"
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim codeProvider As New VBCodeProvider()
Dim compileParameters As New CompilerParameters()
With compileParameters
'// Добавляем ссылки
.ReferencedAssemblies.Add("System.dll"
'// Даем понять компилятору что у нас Class Library
.GenerateExecutable = False
'// Даем понять компилятору что мы будем выгружать DLL на HDD
.GenerateInMemory = False
'// Указываем путь к нашей сборке
.OutputAssembly = assemblyPath
'// Это так.. на всякий случай, для очистки совести
.TreatWarningsAsErrors = True
End With
Dim strCode As New System.Text.StringBuilder
'// Создаем наш класс
With strCode
.AppendLine("Imports System"
.AppendLine("Public Class TestClass"
.AppendLine(String.Format("Public Const Caption As String = {0}Hello World{0}", Chr(34)))
.AppendLine("Public Function CurrentTime() As String"
.AppendLine("Return Date.Now.ToLongTimeString"
.AppendLine("End Function"
.AppendLine("End Class"
End With
'// Компилируем DLL
Dim compileResults As CompilerResults = _
codeProvider.CompileAssemblyFromSource(compileParameters, strCode.ToString)
'// Обработка ошибок на твоей совести
End Sub
Private Sub Button1_Click(ByVal Sender As System.Object, ByVal Args As System.EventArgs) Handles Button1.Click
'// Загружаем сборку
Dim testAssembly As Assembly = Assembly.LoadFrom(assemblyPath)
'// Получаем экземпляр нашего класса
Dim classTest As Object = testAssembly.CreateInstance("TestClass"
'// Узнаем его тип
Dim classType As Type = testAssembly.GetType("TestClass"
'// Получаем содержимое константы
'// Поскольку это константа (так же касается Shared)
'// то в качестве параметра передаем Nothing..
'// Во всех остальных случаях обязаны передать экземпляр класса
Dim Field As FieldInfo = classType.GetField("Caption"
Me.Text = Field.GetValue(Nothing).ToString
'// Вызываем наш метод
'// Так как наш метод не имеет параметров, то передаем Nothing
'// в противном случае обязаны передать массив параметров
Dim Method As MethodInfo = classType.GetMethod("CurrentTime"
Dim Result As String = Method.Invoke(classTest, Nothing).ToString()
MessageBox.Show("CurrentTime: " & Result, "Invoke Method", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
End Class
Номер ответа: 8
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #8
Добавлено: 12.07.06 19:05
2 ПтирЯ, EROS: респект вам! Хотя можно было не расжёвывать настолько — мона было бы сказать о .GetField(), а я б уже догадался))) так что, вопрос о том, как передать объект-форму, уже отпал. :p
Номер ответа: 9
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #9
Добавлено: 13.07.06 01:17
Ок, в следующий раз разжевывать не буду.. )
Номер ответа: 10
Автор ответа:
ПтирЯ
Вопросов: 11
Ответов: 71
Профиль | | #10
Добавлено: 13.07.06 09:39
2 EROS
Dim Res as String = objTheClass.MyVar
мне кажется такой вариант не прокатит, так objTheClass объявлен как As Object, и соответственно он понятия не имеет о существовании MyVar
-------------------------------
Такой вариант работает. Только работает медленней, чем с объектом известного типа. Ну а медленней конечно же относительно. глазу разница незаметна
Номер ответа: 11
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #11
Добавлено: 13.07.06 10:45
2 ПтирЯ: по ходу не прокатилбы с включенным Option Strict.
Номер ответа: 12
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #12
Добавлено: 13.07.06 21:45
А у меня компилятор страшно матерится!! и говорит, что MyVar не принадлежит objTheClass..