Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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
Dim Res as String = objTheClass.MyVar

мне кажется такой вариант не прокатит, так objTheClass объявлен как As Object, и соответственно он понятия не имеет о существовании MyVar

Ответить

Номер ответа: 7
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #7 Добавлено: 12.07.06 00:25
'// VS 2005

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..

Ответить

Страница: 1 |

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



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