Pull to refresh
8
0
Сергей Бабицкий @akaBd

Architect

Send message
это работает… но выглядит ужасно
и все же никакой девайс не заменит хорошие наручные часы…
а где результат посмотреть то?
действительно очень как-то просто
в закладке «избранное» не работает
Продолжаем маршалировать. На этот раз будет рассмотрен способ вызова С-шных функций из C# без использования P/Invoke( [DllImport] ).

заинтересовало
А если быть до конца точным, то [DllImport] использовать все же придется, но только один раз.

wtf?
имхо смысл статьи немного теряется…
использовали 1 раз, можно использовать еще раз
зачем городить что-то?
Первое, с чего нужно начать, это нужно вспомнить, что когда мы от чего-то отказываемся (в данном случае [DllImport]), мы заменяем это чем-то другим.

в итоге P/Invoke использован…
Это магия…
пожалуйста, спасибо за советы
извиняюсь, тэг неправильно закрыл.
Я, к сожалению, не знаком с ArchiCAD, но я не уверен, что утверждение:

Библиотеку (plugin) можно реализовать только на C\C++.
верно.

хмм, ArchiCAD использует собственные генераторы ресурсов… но методом не так много необходимо экспортировать, может и можно подменить C\C++ на managed…
а в Visual Studio встроенных средств/атрибутов для этого не предусмотрено. Зато у нас есть много кода и описаний от разных умельцев: раз, два, три и четыре. Последний использует Cecil и даже имеет шаблон-проект.

Я лично сделал wcx-плагин для Total Commander используя код из второй статьи (методы действительно экспортированы) — все отлично работает и по сей день. :)

Да, помню, когда-то я присматривался к вашему варианту. (вспомнился пункт три<a/>).
Но имхо — метод, что я описал в статье — гораздо проще и не требует особой магии и танцев с бубном.

Можно это убрать. Т.е. создать структуры на 2ух сторонах: на стороне managed и unmanaged dll и потом приводить их (главное чтобы размер совпадал).

но у нас используется именно такая модель, т.е. структуры описаны на стороне managed. Так как они очень объемные (количество данных большое) и проще поддерживать 1 версию структур чем создавать копию на стороне unmanaged dll.
Эээ… Так ComVisible и использование tlb — это уже обращение к COM-маршаллеру, так что обойтись без COM не удалось.

tlb использовался для доступа с структурам на стороне unmanaged dll. Можно это убрать. Т.е. создать структуры на 2ух сторонах: на стороне managed и unmanaged dll и потом приводить их (главное чтобы размер совпадал).
Насчёт проблем с освобождением ресурсов — могу посоветовать их решить ручным управлением ресурсами в unmanaged dll (синий блок) и запуском COM-подсистемы в режиме out-of-process.

Возможно Вы правы. Насколько я помню (утверждать не могу, довольно давно было дело) мы пробовали запускать COM в отдельном процессе, проблему это не решило (с ArchiCADом). Хотя в другом в другом продукте при взаимодействии уже с другим приложением предложенная вами архитектура работает без проблем.
Можно же просто в желтом квадрате, который «managed dll» объявить кокласс-переходник, и его инстанциировать в native dll (синий квадрат)?

Вы правы, действительно можно было так сделать. Т.е. объявить интерфейс, класс к нему и создать в native dll. И все должно действительно работать.
Но в данной статье показано, что можно реализовать «красивое» взаимодействие именно без помощи СОМа.
Т.е. сама цель была не использовать СОМ.

p.s. не использовать потому, что у стороннего приложения (ArchiCAD) есть серьезная проблема с освобождением ресурсом после использования СОМа (валится напрочь)
Честно говоря, работать с инcтрукциями MSIL приходилось очень мало. Вы предлогаете перейти к программированию на низком уровне?
лучше ещё раз соорудить промежуточную неуправляемую заглушку, ведь там всё просто и понятно

Имхо это действительно понятно и просто.
2

Information

Rating
Does not participate
Location
Минск, Минская обл., Беларусь
Date of birth
Registered
Activity