Как загрузить сборку с начальной точки (отображение)?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Ваня
Новичок
Новичок
 
Сообщения: 27
Зарегистрирован: 24.06.2005 (Пт) 22:23
Откуда: Московская обл., д. Нестерово

Как загрузить сборку с начальной точки (отображение)?

Сообщение Ваня » 24.06.2005 (Пт) 22:44

Как загрузить сборку с начальной точки (EntryPoint) используя технологию отображения?

Dim FileName as string = "Путь к любому приложению VB.NET"
Dim App As System.Reflection.Assembly
App = System.Reflection.Assembly.LoadFrom(FileName)
App.EntryPoint.Invoke (.....????......)

При передаче параметров в App.EntryPoint.Invoke возникают ошибки. Если кто-нибудь знает как правильно вызвать этот метод или как загрузить сборку другим способом, пожалуйста, помогите.
Зарнее ОГРОМНОЕ СПАСИБО!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.06.2005 (Сб) 2:54

App.GetType("type").Method
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ваня
Новичок
Новичок
 
Сообщения: 27
Зарегистрирован: 24.06.2005 (Пт) 22:23
Откуда: Московская обл., д. Нестерово

Сообщение Ваня » 25.06.2005 (Сб) 14:35

Что-то я не понял зачем это нужно?
App.GetType("type").Method

Я попробовал:
Код: Выделить всё
        Dim Obj As New Object
        If App.EntryPoint IsNot Nothing Then
            App.GetType(App.EntryPoint.GetType.ToString).InvokeMember(App.EntryPoint.Name, Reflection.BindingFlags.Default Or Reflection.BindingFlags.InvokeMethod, Nothing, Obj, App.EntryPoint.GetParameters)
        End If

Что должно быть Obj вооюще без понятия.
И так не получается:
Код: Выделить всё
   Dim aTypes() As Type = App.GetTypes
   
            Dim i As Integer
            For i = aTypes.GetLowerBound(0) To aTypes.GetUpperBound(0)
                Dim Cntr As New Object
                Try
                    Cntr = App.CreateInstance(aTypes(i).FullName)
                Catch ex As Exception
                End Try

                App.EntryPoint.Invoke(Cntr, Reflection.BindingFlags.Default Or Reflection.BindingFlags.InvokeMethod, Nothing, App.EntryPoint.GetParameters, Nothing)
             Next i

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.06.2005 (Сб) 15:47

Код: Выделить всё
Overloads Public Function Invoke( _
   ByVal obj As Object, _
   ByVal parameters() As Object _
) As Object



Параметры

obj
Экземпляр, который создал этот метод.

parameters
Список аргументов для вызываемого метода или конструктора. Этот список представляет собой массив объектов с таким же количеством, последовательностью и типом элементов, что и у параметров вызываемого метода или конструктора. Если параметров нет, должно быть передано значение пустая ссылка (Nothing в Visual Basic).
Если метод или конструктор, представленный этим экземпляром, принимает параметр по ссылке (ByRef), для вызова с помощью этого параметра метода или конструктора, таким образом, не требуется никаких специальных атрибутов. Любой объект в этом массиве, который явно не инициализирован некоторым значением, будет содержать стандартное значение, установленное для данного объектного типа. Для элементов, передаваемых по ссылке это значение равно пустой ссылке (Nothing). Для элементов, передаваемых по значению, это значение равно 0, 0,0 или false, в зависимости от типа элемента.


Возвращаемое значение
Объект Object, содержащий возвращаемое значение вызванного метода, или (для случая конструктора) вновь инициализированный объект.


Примечания
Этот метод следует использовать для вызова методов со стандартными значениями параметров. Для связывания этих методов отражение требует, чтобы один из флагов связывания DefaultValueBinding, DefaultValueChangeType или DefaultValueFull был задан явно. Это требование справедливо даже в случаях, когда значение передается для параметра, имеющего стандартное значение.

Например, рассмотрим метод MyMethod(int x, float y = 2.0). Чтобы вызывать этот метод только с первым аргументом, скажем, MyMethod (4), следует передать один из упомянутых выше флагов связывания и два аргумента, а именно, 4 для первого аргумента и Missing.Value для второго аргумента. Кроме использования Missing.Value, посредством метода Invoke можно не опускать необязательные параметры. В этом случае следует использовать вызов InvokeMember.

Этот удобный метод вызывает следующий метод Invoke, передавая в качестве остальных параметров значение пустая ссылка (Nothing в Visual Basic). Если вызванный метод создает исключение, метод GetBaseException возвращает исключение.

При вызове статического метода с помощью его объекта MethodInfo первый параметр должен иметь значение пустой ссылке (Nothing), как показано в следующем вызове:

Код: Выделить всё
Object myReturnValue = myMethodInfo.Invoke(null, myParametersArray)



Пример

В следующих примерах демонстрируется динамический поиск средствами отражения. Обратите внимание, что все вызовы возвращают 1, так как метод в классах A и B является виртуальным (Overridable в Visual Basic).

Код: Выделить всё
Public Class A
    Public Overridable Function method() As Integer
        Return 0
    End Function
End Class

Public Class B
    Public Overridable Function method() As Integer
        Return 1
    End Function
End Class

Class Mymethodinfo

    Public Shared Function Main() As Integer
        Console.WriteLine("Reflection.MethodInfo")
        Console.WriteLine()
        Dim MyA As New A()
        Dim MyB As New B()

        'Get the Type and MethodInfo
        Dim MyTypea As Type = Type.GetType("A")
        Dim Mymethodinfoa As MethodInfo = MyTypea.GetMethod("method")

        Dim MyTypeb As Type = Type.GetType("B")
        Dim Mymethodinfob As MethodInfo = MyTypeb.GetMethod("method")

        'Get and display the Invoke method
        Console.WriteLine("First method - {0} returns {1}", MyTypea.FullName, _
            Mymethodinfoa.Invoke(MyA, Nothing).ToString())
        Console.WriteLine("Second method - {0} returns {1}", MyTypeb.FullName, _
           Mymethodinfob.Invoke(MyB, Nothing).ToString())
        Return 0
    End Function
End Class
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ваня
Новичок
Новичок
 
Сообщения: 27
Зарегистрирован: 24.06.2005 (Пт) 22:23
Откуда: Московская обл., д. Нестерово

Сообщение Ваня » 26.06.2005 (Вс) 0:00

Из приведённого примера.

Dim MyTypea As Type = Type.GetType("A") не работает.
Надо Dim MyTypea As Type = MyA.GetType

Вызовы возвращают
Mymethodinfoa.Invoke(MyA, Nothing).ToString() =0
Mymethodinfob.Invoke(MyB, Nothing).ToString() =1,
а не 1 и 1.

Ошибок при этом не возникает.
Но как быть, если заранее не известен тип объектов MyA и MyB?
Dim MyA As ????
Dim MyB As ????


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28

    TopList