Я, к сожалению, не знаком с ArchiCAD, но я не уверен, что утверждение:
Библиотеку (plugin) можно реализовать только на C\C++.
верно.
хмм, ArchiCAD использует собственные генераторы ресурсов… но методом не так много необходимо экспортировать, может и можно подменить C\C++ на managed…
а в Visual Studio встроенных средств/атрибутов для этого не предусмотрено. Зато у нас есть много кода и описаний от разных умельцев: раз, два, три и четыре. Последний использует Cecil и даже имеет шаблон-проект.
Я лично сделал wcx-плагин для Total Commander используя код из второй статьи (методы действительно экспортированы) — все отлично работает и по сей день. :)
Можно это убрать. Т.е. создать структуры на 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) есть серьезная проблема с освобождением ресурсом после использования СОМа (валится напрочь)
заинтересовало
wtf?
имхо смысл статьи немного теряется…
использовали 1 раз, можно использовать еще раз
зачем городить что-то?
в итоге P/Invoke использован…
хмм, ArchiCAD использует собственные генераторы ресурсов… но методом не так много необходимо экспортировать, может и можно подменить C\C++ на managed…
Да, помню, когда-то я присматривался к вашему варианту. (вспомнился пункт три<a/>).
Но имхо — метод, что я описал в статье — гораздо проще и не требует особой магии и танцев с бубном.
но у нас используется именно такая модель, т.е. структуры описаны на стороне managed. Так как они очень объемные (количество данных большое) и проще поддерживать 1 версию структур чем создавать копию на стороне unmanaged dll.
tlb использовался для доступа с структурам на стороне unmanaged dll. Можно это убрать. Т.е. создать структуры на 2ух сторонах: на стороне managed и unmanaged dll и потом приводить их (главное чтобы размер совпадал).
Возможно Вы правы. Насколько я помню (утверждать не могу, довольно давно было дело) мы пробовали запускать COM в отдельном процессе, проблему это не решило (с ArchiCADом). Хотя в другом в другом продукте при взаимодействии уже с другим приложением предложенная вами архитектура работает без проблем.
Вы правы, действительно можно было так сделать. Т.е. объявить интерфейс, класс к нему и создать в native dll. И все должно действительно работать.
Но в данной статье показано, что можно реализовать «красивое» взаимодействие именно без помощи СОМа.
Т.е. сама цель была не использовать СОМ.
p.s. не использовать потому, что у стороннего приложения (ArchiCAD) есть серьезная проблема с освобождением ресурсом после использования СОМа (валится напрочь)
Имхо это действительно понятно и просто.