Помогите С DLL Plugin(Struct=Object??)

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

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

Ladder
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 04.08.2005 (Чт) 23:57

Помогите С DLL Plugin(Struct=Object??)

Сообщение Ladder » 02.10.2005 (Вс) 14:49

делаю прогу

хотелось бы сделать подключение плагинов. Но возникла проблема.

Хотелось для удобства с длл брать не (String,Integer,Single и т.д), а Structure или Class если ето возможно

например создаю плагин(длл) на vb.net и надо определить его параметры . я делаю так:

; Плагин

Public Class Plugin

Structure PluginInfo
dim name As String
dim version As Single
End Class

Public Function GetInfo() As PluginInfo
Dim pi As New PluginInfo()

pi.name = "Test Plagin"
pi.version = 0.1

Return pi
End Function


End Class


; Программа
Structure PluginInfo
Dim name As String
Dim version As Single
End Structure

Public Class Plugin
Dim A As [Assembly]

Dim _FileName As String

Public Sub New(ByVal filename As String)
_FileName = filename
End Sub

Public Sub Load()
A = [Assembly].LoadFrom(_FileName) 'Loads the DLL
End Sub

Public Function Info()
Dim t As Type = A.GetType("PluginDLL.Plugin")
Dim bf As BindingFlags = BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance

Dim obj As Object = t.InvokeMember("GetInfo", bf Or BindingFlags.CreateInstance, Nothing, Nothing, Nothing)
Return t.InvokeMember("GetInfo", bf Or BindingFlags.InvokeMethod, Nothing, obj, Nothing)
End Function


End Class

Public Function LoadPlugin()

Dim getinfo As New PluginInfo()

getinfo = NewPlugin.Info
Debug.WriteLine(getinfo.version.ToString)

End Function

И на строке << getinfo = NewPlugin.Info >> возникает ошибка {Additional information: Specified cast is not valid.}

Вроде в ДДЛ функция GetInfo() возращает(Return) значение pi как Object и из-за этого getinfo = NewPlugin.Info несовмещаются. Если NewPlugin.Info является Object, то кок можно это сконвертировать в Structure PluginInfo?????

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 03.10.2005 (Пн) 7:05

Долго пытался читать код, ничего не понял
Весь мир матрица, а мы в нем потоки байтов!

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 03.10.2005 (Пн) 8:36

вынеси интерфейсы в отдельную сборку
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Ladder
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 04.08.2005 (Чт) 23:57

Сообщение Ladder » 03.10.2005 (Пн) 16:10

А как выглядит команда интерфейс?? Дело в том что я недавно перешёл на Visual Basic NET с BlitzBasic,BlitzMax,PureBasic,C++. И нет никакой документации, и изучаю его по семплам и методом тыка,и смотрю этот форум(кстати он один из лучших!)(Ладно не потеме ;)

Как я должен использовать эту команду(interface)????

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 03.10.2005 (Пн) 16:17

Интерфейс - это не команда, это описание методов и свойств класса.

Лучше всего вынести в отдельную сборку весь механизм плагинов, плюс описание интерфейса каждого из плагинов (что рекомендует Себас). Как объявлять интерфейсы посмотрите на http://msdn.microsoft.com. Ключевое слово Interface.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Ladder
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 04.08.2005 (Чт) 23:57

Сообщение Ladder » 03.10.2005 (Пн) 17:57

Порылся я в http://msdn.microsoft.com, пока не очень ясно. Помогите разобратся.

например:

Это плагин

Public Class TestPlugin

Interface testinter
Function GetStruct() As Struct
End Interface

Structure Struct
dim num as integer
End Structure

Public Function GetStruct() As Struct
dim newStruct As New Struct
newStruct.a = 999
Return newStruct
End Function

End Class

------
Программа

Public Interface DLLInterface
Function GetStruct() As Struct
End Interface

Structure Struct
dim num as integer
End Structure


' загрузка плагина
Function LoadPlugin(_FileName as String)
A = [Assembly].LoadFrom(_FileName) 'Loads the DLL
Dim t As Type = A.GetType("devin.DevBlock")
Dim bf As BindingFlags = BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance

Dim obj As Object = t.InvokeMember("GetStruct ", bf Or BindingFlags.CreateInstance, Nothing, Nothing, Nothing)

Dim ar As Object = t.InvokeMember("GetStruct", bf Or BindingFlags.InvokeMethod, Nothing, obj, Nothing)

Dim at As PluginInfo
at = ar '-Error Additional information: Specified cast is not valid.
End Function

А куда надо поставит <Implements>Я идиот! Убейте меня, кто-нибудь!
Покажите пожалуйста на примере кода,как мне вытащить Structure (Struct) из DLL плагина(из функции GetStruct()) ,чтоб не возникало это самое непонятное <Specified cast is not valid> прошло 3 дня как я на этом завис , и чо-то не понять. :(

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 03.10.2005 (Пн) 19:49

- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru


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

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

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

    TopList