|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
05.07.2013, 15:33 | #1 | |
C++ to С++ CLI. Миграция на .NET.
Регистрация: 27.06.2013
Сообщений: 8
|
||
Просмотров: 9532
|
|
||||
Цитата:
|
||||
|
||||
Josser Регистрация: 09.11.2011
Сообщений: 66
|
Я бы не лез с ключом /clr в ObjectARX от греха подальше. Проще с этим ключом компилировать .dll, реализующую конкретный функционал, задействующий управляемые библиотеки .NET (например взаимодействие с БД). А вот эту mixed-mode .dll загружать из нэйтивного .arx приложения через LoadLibrary(). Понятно, что такая .dll должна экспонировать набор функций вида extern "C" __declspec(dllexport)..... Я бы так делал (ИМХО).
__________________
... пути твои в водах многих, и следы твои не познaются. |
|||
|
||||
Регистрация: 27.06.2013
Сообщений: 8
|
Спасибо за столь ценный совет, но прежде чем создавать тему на форуме я достаточно много времени потратил именно на это. Если сможете предоставить полезную ссылку - буду очень признателен.
Цитата:
Цитата:
|
|||
|
||||
Josser Регистрация: 09.11.2011
Сообщений: 66
|
Вопросы маршаллинга придется решать абсолютно в одинаковой мере, делаете вы все в одном .arx модуле, или выделяете смешанный код в отдельную .dll. Просто в указанном мной способе вы взаимодействуете с автокадом хорошо изученным способом через нативный ObjectARX, а взаимодействие с .NET выносите "за скобки".
Найдите книгу Nishant Sivakumar "C++/CLI in action". Я её читал когда-то для общего развития. Там как раз очень толково и последовательно рассмотрены вопросы взаимодействия управляемого и неуправляемого кода в т.ч. маршаллинг, разумеется.
__________________
... пути твои в водах многих, и следы твои не познaются. |
|||
|
||||
Цитата:
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
|
||||
Цитата:
Цитата:
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
|
||||
Josser Регистрация: 09.11.2011
Сообщений: 66
|
Жаль, что мистер Cyrille Fauvel не объясняет, почему. Требование .arx приложению грузиться через NETLOAD выглядит, как минимум, странно для случаев, когда библиотеки acdbmgd.dll и acmgd.dll не используются и нет необходимости через рефлексию вылавливать функции, помеченные атрибутами типа [CommandMethod()] .
Но лично для меня это лишь дополнительный аргумент, чтобы не лезть с ключом /clr в ObjectARX Последний раз редактировалось Salt, 07.07.2013 в 00:37. |
|||
|
||||
Одна из причин:
Есть еще один вариант, когда можно загружать такое приложение как обычный arx-файл - использовать опцию линкера /NOENTRY, но этот вариант считается не самым удачным и не рекомендуется. Ну и еще одна ссылка: How to turn an ARX Application into a Managed C++ Application? Последний раз редактировалось Александр Ривилис, 07.07.2013 в 03:14. |
||||
|
||||
Регистрация: 27.06.2013
Сообщений: 8
|
И тогда придется реализовывать взаимодействие с AutoCAD через рефлексию с использованием атрибута [CommandMethod()]? Я правильно понимаю?
Цитата:
А вообще в целом очень интересно как происходит подобная миграция у других проектов. Ведь это же не уникальный случай. Множество проектов должно быть реализовано с использованием ObjectARX, и, наверняка, многие из них в последствии перешли на .Net. Как интересно это осуществлялось? Был ли у кого из вас подобный опыт? Всем большое спасибо за отклики! |
|||
|
||||
Если мне не изменяет память в этом случае при загрузке/выгрузке dll-файла не вызывается DLLMain и соотвественно инициализацию кода нужно делать как-то иначе и в другом месте.
Цитата:
Совершенно не факт. И вообще для меня .NET - это C#. А mixed C++ только для написания обёрток для native ObjectARX классов/методов, которые не написали программисты Autodesk. Впрочем, это моё личное мнение.
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
|
||||
Регистрация: 27.06.2013
Сообщений: 8
|
Попытался сделать таким образом. На команду NETLOAD - AutoCAD предлагает мне окошко, в котором я могу выбрать исключительно файлы с расширением .dll. Ладно, собираю модуль с расширением .dll - при загрузке через netload - результат неудачный:
System.IO.FileLoadException: A dynamic link library (DLL) initialization routine failed. (Exception from HRESULT: 0x8007045A) Пробовал загрузку .arx-файла собранного с ключом /noentry и загрузкой через команду ARX - AutoCAD падает без особых сообщений, только предлагает отправить отчет. Наверное, это уже тонкости нашего проекта, и копать надо в них, либо искать другое решение. Но тем не менее, всем большое спасибо за помощь. |
|||
|
||||
Josser Регистрация: 09.11.2011
Сообщений: 66
|
Есть ведь еще один способ взаимодействия .arx и .NET dll - это функции, экспортируемые через acedDefun() в случае ObjectARX и с помощью атрибута [LispFunction] в случае чистого .NET приложения. Иными словами команда автокада, написанная на нативном ObjectARX (а в общем случае любой код, выполняющийся в контексте документа) может запросто вызывать функции из .NET приложения, написанного, скажем, на C#. И наоборот.
|
|||
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
Цитата:
|
|||
|
||||
Josser Регистрация: 09.11.2011
Сообщений: 66
|
Не через жо, а через структуру resbuf (класс ResultBuffer для .NET) в качестве носителя аргументов и возвращаемого значения. Вызов происходит напрямую, если на стороне ObjectARX совместно с acedDefun() задействована функция acedRegFunc():
Цитата:
Offtop: Вы ведь сами, уважаемый Гомер, пользуйтесь всякими vla- и vlax- даже глазом не моргнув, а ведь это куда более "через жо". Последний раз редактировалось Salt, 08.07.2013 в 22:43. |
|||
|
||||
Josser Регистрация: 09.11.2011
Сообщений: 66
|
Есть ограничение по типу аргументов и возвращаемого значения. Но прошу заметить, это стандартный способ взаимодействия между .arx (а теперь и .NET) приложениями. Начиная с 2014 автокада взаимодействие ObjectARX и NET приложений с браузерными JavaScript сценариями строится подобным же образом.
Последний раз редактировалось Salt, 08.07.2013 в 22:31. |
|||
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
реализация задачи visual studio2012 (visual basic .net) autocad 2012, oracle11g | Anta | .NET | 32 | 31.12.2012 07:35 |
Портирование .Net + lisp приложений для BricsCAD | Sleekka | LISP | 12 | 25.12.2012 11:41 |
Extended AutoCAD .Net API | hwd | .NET | 5 | 22.08.2012 19:38 |
.Net событие double-click как поймать | dvim | .NET | 7 | 04.04.2010 15:13 |