| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > C++ to С++ CLI. Миграция на .NET.

C++ to С++ CLI. Миграция на .NET.

Ответ
Поиск в этой теме
Непрочитано 05.07.2013, 15:33 #1
C++ to С++ CLI. Миграция на .NET.
Rizling
 
Регистрация: 27.06.2013
Сообщений: 8

Приветствую уважаемых посетителей форума!
Есть следующая проблема. У организации имеется достаточно большой проект - расширение AutoCAD. Планируется его постепенный перевод на .NET. На данный момент в проекте активно используется COM, к примеру для взаимодействия с БД. Хотелось бы отойти от использования COM заменив его взаимодействием посредством .NET. И вот сейчас изучается возможность перевода существующего нативного С++ кода в управляемый C++\CLI.

Возможно ли это в целом? И в частности - возможно ли это не переходя на .Net-API? Т.е. возможно ли использование управляемого кода с ObjectARX.

На данный момент была предпринята попытка просто пересобрать проект с использованием ключа /CLR и загрузить в AutoCAD - проект собрался нормально только после подключений acdbmgd.dll и acmgd.dll. Без их подключения получалось множество ошибок компиляции в АПИшном файле AutoCADa mdginterop.h. Загрузка в AutoCAD - вызывает ошибку времени выполнения r6033. Её пока победить не удалось. Хоть вродя я уже по всему коду расставил диррективу #pragma unmanaged - ошибка повторяется из раза в раз.

Если кто что посоветует - буду безумно благодарен. Особенно буду признателен за советы о постепенном переводе подобных проектов под .Net.
Просмотров: 9443
 
Непрочитано 05.07.2013, 16:15
#2
hexD

КМД
 
Регистрация: 26.03.2013
Я ЖЫВУ В РОССИИ.
Сообщений: 506
<phrase 1=


погуглить?
hexD вне форума  
 
Непрочитано 05.07.2013, 18:23
1 | #3
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Rizling Посмотреть сообщение
проект собрался нормально только после подключений acdbmgd.dll и acmgd.dll.
Ну так это и не удивительно. Начиная с версии 2013 понадобится подключать ещё и accore.dll. Набор подключаемых библиотек может отличаться, т.к. разный задействованный вам функционал определён в разных dll файлах, предоставленных Autodesk.
hwd вне форума  
 
Непрочитано 05.07.2013, 20:20
1 | #4
Salt

Josser
 
Регистрация: 09.11.2011
Сообщений: 66


Я бы не лез с ключом /clr в ObjectARX от греха подальше. Проще с этим ключом компилировать .dll, реализующую конкретный функционал, задействующий управляемые библиотеки .NET (например взаимодействие с БД). А вот эту mixed-mode .dll загружать из нэйтивного .arx приложения через LoadLibrary(). Понятно, что такая .dll должна экспонировать набор функций вида extern "C" __declspec(dllexport)..... Я бы так делал (ИМХО).
__________________
... пути твои в водах многих, и следы твои не познaются.
Salt вне форума  
 
Автор темы   Непрочитано 06.07.2013, 14:59
#5
Rizling


 
Регистрация: 27.06.2013
Сообщений: 8


Цитата:
Сообщение от hexD Посмотреть сообщение
погуглить?
Спасибо за столь ценный совет, но прежде чем создавать тему на форуме я достаточно много времени потратил именно на это. Если сможете предоставить полезную ссылку - буду очень признателен.

Цитата:
Сообщение от hwd Посмотреть сообщение
Ну так это и не удивительно. Начиная с версии 2013 понадобится подключать ещё и accore.dll. Набор подключаемых библиотек может отличаться, т.к. разный задействованный вам функционал определён в разных dll файлах, предоставленных Autodesk.
Это понятно, сейчас пробовал пока только для 2010 и 2012. Но в целом, я же не использую .Net API, хоть и собираю с /CLR. Вот мне в связи с этим и хочется узнать возможно ли смешанный код (управляемый и не управляемый) использовать в одном модуле? причем модуль будет взаимодействовать с AutoCAD через ObjectARX, а не через .Net API.

Цитата:
Сообщение от Salt Посмотреть сообщение
Я бы не лез с ключом /clr в ObjectARX от греха подальше. Проще с этим ключом компилировать .dll, реализующую конкретный функционал, задействующий управляемые библиотеки .NET (например взаимодействие с БД). А вот эту mixed-mode .dll загружать из нэйтивного .arx приложения через LoadLibrary(). Понятно, что такая .dll должна экспонировать набор функций вида extern "C" __declspec(dllexport)..... Я бы так делал (ИМХО).
Такой вариант тоже рассматривался, но как я понял при таком варианте всплывает множество проблем с маршаллингом данных из .Net в нативный модуль.
Rizling вне форума  
 
Непрочитано 06.07.2013, 20:37
1 | #6
Salt

Josser
 
Регистрация: 09.11.2011
Сообщений: 66


Вопросы маршаллинга придется решать абсолютно в одинаковой мере, делаете вы все в одном .arx модуле, или выделяете смешанный код в отдельную .dll. Просто в указанном мной способе вы взаимодействуете с автокадом хорошо изученным способом через нативный ObjectARX, а взаимодействие с .NET выносите "за скобки".
Найдите книгу Nishant Sivakumar "C++/CLI in action". Я её читал когда-то для общего развития. Там как раз очень толково и последовательно рассмотрены вопросы взаимодействия управляемого и неуправляемого кода в т.ч. маршаллинг, разумеется.
__________________
... пути твои в водах многих, и следы твои не познaются.
Salt вне форума  
 
Непрочитано 06.07.2013, 20:57
1 | #7
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Rizling Посмотреть сообщение
Но в целом, я же не использую .Net API, хоть и собираю с /CLR. Вот мне в связи с этим и хочется узнать возможно ли смешанный код (управляемый и не управляемый) использовать в одном модуле? причем модуль будет взаимодействовать с AutoCAD через ObjectARX, а не через .Net API.
Грузить его в AutoCAD придётся через NETLOAD.
Александр Ривилис вне форума  
 
Непрочитано 06.07.2013, 21:07
1 | #8
Salt

Josser
 
Регистрация: 09.11.2011
Сообщений: 66


Если модуль .arx, скомпилирован с ключом /clr (о чем,собственно, и идет речь и от чего я пытаюсь отговорить), то грузить его надо через ARX

Последний раз редактировалось Salt, 06.07.2013 в 21:12.
Salt вне форума  
 
Непрочитано 06.07.2013, 21:27
1 | #9
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Salt Посмотреть сообщение
Если модуль .arx, скомпилирован с ключом /clr (о чем,собственно, и идет речь и от чего я пытаюсь отговорить), то грузить его надо через ARX
Нет. Если не доверяешь мне - поверь Cyrille Fauvel (член ADN DevHelp, автор ObjectARX Wizard):
Цитата:
But you should not load mixed managed code arx via ARXLOAD
but instead use NETLOAD command.
Александр Ривилис вне форума  
 
Непрочитано 07.07.2013, 00:28
1 | #10
Salt

Josser
 
Регистрация: 09.11.2011
Сообщений: 66


Жаль, что мистер Cyrille Fauvel не объясняет, почему. Требование .arx приложению грузиться через NETLOAD выглядит, как минимум, странно для случаев, когда библиотеки acdbmgd.dll и acmgd.dll не используются и нет необходимости через рефлексию вылавливать функции, помеченные атрибутами типа [CommandMethod()] .
Но лично для меня это лишь дополнительный аргумент, чтобы не лезть с ключом /clr в ObjectARX

Последний раз редактировалось Salt, 07.07.2013 в 00:37.
Salt вне форума  
 
Непрочитано 07.07.2013, 02:59
1 | #11
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Salt Посмотреть сообщение
Жаль, что мистер Cyrille Fauvel не объясняет, почему.
Одна из причин:
Цитата:
Сообщение от Rizling Посмотреть сообщение
Загрузка в AutoCAD - вызывает ошибку времени выполнения r6033
Есть еще один вариант, когда можно загружать такое приложение как обычный arx-файл - использовать опцию линкера /NOENTRY, но этот вариант считается не самым удачным и не рекомендуется.

Ну и еще одна ссылка: How to turn an ARX Application into a Managed C++ Application?

Последний раз редактировалось Александр Ривилис, 07.07.2013 в 03:14.
Александр Ривилис вне форума  
 
Непрочитано 07.07.2013, 09:53
#12
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
использовать опцию линкера /NOENTRY, но этот вариант считается не самым удачным и не рекомендуется.
Можно поподробней? Что с ним не так?
hwd вне форума  
 
Автор темы   Непрочитано 07.07.2013, 11:10
#13
Rizling


 
Регистрация: 27.06.2013
Сообщений: 8


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Грузить его в AutoCAD придётся через NETLOAD.
И тогда придется реализовывать взаимодействие с AutoCAD через рефлексию с использованием атрибута [CommandMethod()]? Я правильно понимаю?


Цитата:
Сообщение от Salt Посмотреть сообщение
Вопросы маршаллинга придется решать абсолютно в одинаковой мере, делаете вы все в одном .arx модуле, или выделяете смешанный код в отдельную .dll.
Спасибо, я еще поизучаю эту возможность поподробнее, просто пока меня поставили в такие рамки. Но да, возможно и придется вернуться к такому подходу, что советуете Вы.

А вообще в целом очень интересно как происходит подобная миграция у других проектов. Ведь это же не уникальный случай. Множество проектов должно быть реализовано с использованием ObjectARX, и, наверняка, многие из них в последствии перешли на .Net. Как интересно это осуществлялось? Был ли у кого из вас подобный опыт? Всем большое спасибо за отклики!
Rizling вне форума  
 
Непрочитано 07.07.2013, 16:38
1 | #14
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от hwd Посмотреть сообщение
Можно поподробней? Что с ним не так?
Если мне не изменяет память в этом случае при загрузке/выгрузке dll-файла не вызывается DLLMain и соотвественно инициализацию кода нужно делать как-то иначе и в другом месте.

Цитата:
Сообщение от Rizling Посмотреть сообщение
И тогда придется реализовывать взаимодействие с AutoCAD через рефлексию с использованием атрибута [CommandMethod()]? Я правильно понимаю?
Нет. Средства ObjectARX никуда не деваются.

Цитата:
Сообщение от Rizling Посмотреть сообщение
...и, наверняка, многие из них в последствии перешли на .Net...
Совершенно не факт. И вообще для меня .NET - это C#. А mixed C++ только для написания обёрток для native ObjectARX классов/методов, которые не написали программисты Autodesk. Впрочем, это моё личное мнение.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 08.07.2013, 13:42
#15
Rizling


 
Регистрация: 27.06.2013
Сообщений: 8


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Грузить его в AutoCAD придётся через NETLOAD.
Попытался сделать таким образом. На команду NETLOAD - AutoCAD предлагает мне окошко, в котором я могу выбрать исключительно файлы с расширением .dll. Ладно, собираю модуль с расширением .dll - при загрузке через netload - результат неудачный:
System.IO.FileLoadException: A
dynamic link library (DLL) initialization routine failed. (Exception from
HRESULT: 0x8007045A)

Пробовал загрузку .arx-файла собранного с ключом /noentry и загрузкой через команду ARX - AutoCAD падает без особых сообщений, только предлагает отправить отчет.

Наверное, это уже тонкости нашего проекта, и копать надо в них, либо искать другое решение. Но тем не менее, всем большое спасибо за помощь.
Rizling вне форума  
 
Непрочитано 08.07.2013, 21:55
1 | #16
Salt

Josser
 
Регистрация: 09.11.2011
Сообщений: 66


Есть ведь еще один способ взаимодействия .arx и .NET dll - это функции, экспортируемые через acedDefun() в случае ObjectARX и с помощью атрибута [LispFunction] в случае чистого .NET приложения. Иными словами команда автокада, написанная на нативном ObjectARX (а в общем случае любой код, выполняющийся в контексте документа) может запросто вызывать функции из .NET приложения, написанного, скажем, на C#. И наоборот.
Salt вне форума  
 
Непрочитано 08.07.2013, 22:02
#17
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Salt Посмотреть сообщение
Есть ведь еще один способ взаимодействия .arx и .NET dll - это функции, экспортируемые через acedDefun() в случае ObjectARX и с помощью атрибута [LispFunction] в случае чистого .NET приложения. Иными словами команда автокада, написанная на нативном ObjectARX (а в общем случае любой код, выполняющийся в контексте документа) может запросто вызывать функции из .NET приложения, написанного, скажем, на C#. И наоборот.
Через жо, извините?
gomer вне форума  
 
Непрочитано 08.07.2013, 22:15
1 | #18
Salt

Josser
 
Регистрация: 09.11.2011
Сообщений: 66


Не через жо, а через структуру resbuf (класс ResultBuffer для .NET) в качестве носителя аргументов и возвращаемого значения. Вызов происходит напрямую, если на стороне ObjectARX совместно с acedDefun() задействована функция acedRegFunc():
Цитата:
Registers an external function so that the ARX library can call it directly, bypassing the dispatch loop.
Со стороны .NET это происходит "автоматом".

Offtop: Вы ведь сами, уважаемый Гомер, пользуйтесь всякими vla- и vlax- даже глазом не моргнув, а ведь это куда более "через жо".

Последний раз редактировалось Salt, 08.07.2013 в 22:43.
Salt вне форума  
 
Непрочитано 08.07.2013, 22:23
#19
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


@Salt,
мягко говоря, не самый лучший способ.
hwd вне форума  
 
Непрочитано 08.07.2013, 22:25
#20
Salt

Josser
 
Регистрация: 09.11.2011
Сообщений: 66


Есть ограничение по типу аргументов и возвращаемого значения. Но прошу заметить, это стандартный способ взаимодействия между .arx (а теперь и .NET) приложениями. Начиная с 2014 автокада взаимодействие ObjectARX и NET приложений с браузерными JavaScript сценариями строится подобным же образом.

Последний раз редактировалось Salt, 08.07.2013 в 22:31.
Salt вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > C++ to С++ CLI. Миграция на .NET.

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
реализация задачи 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