.net vs PB

Раздел посвящен программированию с использованием Power Basic.
Kroos
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 21.02.2012 (Вт) 16:57

.net vs PB

Сообщение Kroos » 08.09.2014 (Пн) 0:03

Нужен грамотный пример взаимодействия PB DLL <-> .NET DLL
нарыл кое-что на оффоруме, интересно аттач myassembly.zip скачать, может кто нибудь? Но это не особо важно, как этот пример сам по себе, годный или нет? Или есть получше, просто я не нашел? Подскажите что по теме.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: .net vs PB

Сообщение jangle » 14.09.2014 (Вс) 12:10

Сделать из .NET сборки COM DLL и использовать ее как обычный COM объект.

Kroos
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 21.02.2012 (Вт) 16:57

Re: .net vs PB

Сообщение Kroos » 03.10.2014 (Пт) 8:27

хм, не догадался, спасибо попробую ) Но все таки, интересуюсь "общепринятыми" практиками по этому вопросу, или их нет и каждый выкручивается кто во что горазд?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: .net vs PB

Сообщение Mikle » 03.10.2014 (Пт) 9:26

jangle писал(а):Сделать из .NET сборки COM DLL и использовать ее как обычный COM объект.

Это как в анекдоте - смотря что во что должно быть встроено.
По идее - нужно встраивать PB куски в общую .NET программу, ведь .NET более высокоуровневый. Только зачем? Что такого можно написать на PB, что может пригодиться на .NET, но на самом .NET написать не выходит? Ну, разве что, ассемблерную вставку?

Kroos
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 21.02.2012 (Вт) 16:57

Re: .net vs PB

Сообщение Kroos » 08.10.2014 (Ср) 6:46

Не совсем все просто - на PB я делаю плагин к другой программе (с которой по NET пообщаться никак, нужна обертка). вот и хочу чтобы плагины к этой программе можно было на NET писать, а общались бы они через PB.DLL обертку. Логично чтобы обертка могла просто вызывать методы классов или функции из net библы, не заставлять же разработчика совать в свою библу pb код, да и уже существующие библы хотелось бы поюзать... я встречал в сети код вызова простой net-функции с msgbox, но там на код страшно смотреть. вариант с COM подходит, но не совсем... получается не будет универсальности, надо будет под каждую библу свой плагин делать, а это не та цель с которой это задумывалось...

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 08.10.2014 (Ср) 12:23

Kroos писал(а):с которой по NET пообщаться никак, нужна обертка

А такой вариант и обёртка на .NET не подойдёт?

Kroos
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 21.02.2012 (Вт) 16:57

Re: .net vs PB

Сообщение Kroos » 08.10.2014 (Ср) 13:06

уже увидел, занес в закладки, попробую. В принципе приемлемый, спасибо. Но, также как и COM, подходит только для специально написанных с учетом этого net библ... ну чтож, наверное придется успокоиться и на этом.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 08.10.2014 (Ср) 15:01

Просто я тоже думал для одной программы плагин на .NET сделать. Правда ещё не начинал, так что про корректность идеи ничего сказать не могу, но саму идею всё же расскажу.
  1. Пишем одну dll, в ней делаем экспортируемые функции так, как того ожидает вызывающая программа.
  2. Объявляем где-то (думаю про эту же библиотеку, но если это вызывает проблемы, то можно положить отдельно) .NET'овский интерфейс плагина.
  3. Плагины сами по себе делаются в отдельных dll, причём имеют ссылку на библиотеку с интерфейсом. Они предоставляют публичный класс, реализующий данный интерфейс. Пусть файл одного из таких плагинов называется SomePlugin.dll.
  4. Для вызывающей программы кладём понятный для неё файл оболочки с именем SomePlugin.wrapper.dll. Он будет выполнять роль переходника между программой и .net-плагином в файле SomePlugin.dll.
При этом сама оболочка выполняет следующие действия:
  1. При инициализации узнаёт своё имя файла SomePlugin.wrapper.dll.
  2. При помощи рефлексии подгружает соседний файл SomePlugin.dll (для получения его имени выкидывается лишний кусок собственного).
  3. При помощи рефлексии создаёт инстанс класса плагина и приводит его к интерфейсу.
  4. Вызовы экспортируемых функций прокидываются классу через соответствующие методы интерфейса. Аналогично в обратную сторону прокидываются возвращаемые значения.
  5. По необходимости можно реализовать вызовы методов программы аналогичным способом. Например, передать некий объект в конструктор плагина.
При таком подходе должен получиться один переходник, который не нужно перекомпилировать - нужно просто переименовывать его в соответствии с именем плагина и класть рядом. Хотя есть небольшой минус в том, что будет лежать охапка одинаковых файлов под разными именами и в случае изменения переходника это всё придётся апдейтить. С другой стороны, тут несколько иная цель - минимизировать затраты на разработку и изменение плагина, а не переходника (потому что ручная декомпиляция, изменение и повторная компиляция - это не то, что бы хотелось делать много раз, особенно во время разработки плагина, когда он перекомпилируется чуть ли не каждые 5 минут. Ну и из плюсов - можно создать дополнительную версию переходника с логированием отладочной информации (а может даже с выводом на форму, чтобы в реалтайме видеть, как идёт взаимодействие программы с плагином).

Да, интерфейс нужен чтобы по минимуму использовать рефлексию - она всё-таки достаточно затратна и не хотелось бы просто так уменьшать производительность. Изначальная мысль, что интерфейс находится в библиотеке обёртки, на которую ссылается плагин (как на бинарный файл, имя сразу в соответствии с именем плагина), но есть сомнения в отсутствии принципиальных косяков при таком подходе. Вполне возможно, что понадобится третий файл, содержащий интерфейс, на который будут ссылаться и вреппер, и плагин. В таком случае, этот файл окажется общим для всех плагинов (иначе придётся перекомпилировать вреппер под плагин, чего хочется избежать).
Класс для вызова методов приложения (если он существует) кладётся туда же, куда интерфейс плагина.

PS: Очень хотелось бы услышать комментарии по поводу этой идеи, а то она существует уже давно, но только на уровне идеи - никак не доберусь до её реализации... Вдруг есть какие-то принципиальные моменты, оставшиеся незамеченными.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: .net vs PB

Сообщение FireFenix » 10.10.2014 (Пт) 21:18

чё-то у вас всё сложно...

чтобы обертка могла просто вызывать методы классов или функции из net библы

для этого существует ICLRRuntimeHost::ExecuteInDefaultAppDomain

Kroos писал(а):Нужен грамотный пример взаимодействия PB DLL <-> .NET DLL

http://www.codingvision.net/tips-and-tr ... ve-process
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Kroos
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 21.02.2012 (Вт) 16:57

Re: .net vs PB

Сообщение Kroos » 11.10.2014 (Сб) 17:18

Помогите код сконвертировать ?
В эту PB функцию из неуправляемого кода прилетает указатель на массив указателей null-terminated строк, нужно их перезаписать:
Код: Выделить всё
GLOBAL ArrayItem1       AS ASCIIZ PTR
GLOBAL ArrayItem2       AS ASCIIZ PTR

FUNCTION nGetArray (BYVAL strArray AS DWORD PTR) AS LONG
    ArrayItem1 = @strArray[0]
    ArrayItem2 = @strArray[1]
    ? @@ArrayItem1+@@ArrayItem2
    SetSzValue @strArray[0], "New Value1"
    SetSzValue @strArray[1], "New Value2"
    FUNCTION = %TRUE
END FUNCTION 

SUB SetSzValue(BYREF szWrite AS DWORD, BYVAL strValue AS STRING)
    GlobalFree szWrite
    szWrite = GlobalAlloc(%GPTR, LEN(strValue) + 1)
    POKE$ szWrite, strValue
END SUB 


Как то же самое написать на VB# ? Курю мануал по MarshalAs, но чтото глухо...


Вернуться в Power Basic

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

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

    TopList