autoloader 2015

Автор Тема: autoloader 2015  (Прочитано 7726 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
autoloader 2015
« : 24-09-2019, 19:36:20 »
Добрый день коллеги.
Нужна ваша помощь ибо либо у меня глаза уже не видят либо где то чтото я делаю не так.
Есть апликашка mixed-mode c++ в которой интефеис сделан в C# (WIndows Forms) - изврашенство я понимаю :).
при запуске создаются скрытые немодальные окна из C#.
если загружать программу через NETLOAD, то всё ок.
сделал на версии от 2012 до 2019.
пробовал 2012, 2015, 2018, 2019.
все грузятся кроме 2015 (ну т.е. путается загрузится, но падает ибо не может создать окно C#)
причем если закинуть C# DLL в папку AutoCAD, то тоже загрузается без проблем.

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

Пробоват подключится к этому из VS и падает на класе у которого в конструкторе я окна C# создаю. класс - типо сессия, создается в initApp

может кто сталкивался? или знает куда смотреть?

с curDoc() уже проверил, там всё ок.


Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: autoloader 2015
« Ответ #1 : 24-09-2019, 19:52:46 »
А теперь всё тоже самое, но подробнее.
1. Это mixed C++ - это dll-файл, который грузит в свою очередь C# dll-файл? Если да, то как он грузит. Если нет, то как происходит загрузка этих модулей? Пока ничего непонятно.
2. Установлены ли все обновления для AutoCAD 2015? Если нет - установить.
3. Нет ли путаницы с версиями .NET Framework?
4. C#-модуль использует AutoCAD .NET API?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Re: autoloader 2015
« Ответ #2 : 24-09-2019, 20:01:35 »
1. C# DLL привязан к mixed-mode C++ DLL как референс.
соответственно я явно этот C# DLL не подгружаю, просто создаю объекты (окна).
2. поставил SP2, не помогло
3. C# DLL закомпилин с .NET 3.5. для того чтобы работал с версиями ACAD от 2010.
4. никакого функционала, всё завязано на event'ах которые обрабатываются в mixed-mode C++ DLL

П.С. пробовал загрузить принудительно через System::Reflection::Assembly::LoadFile(fullPath);
загрузился без ошибок, но далее по коду вылезли те же ошибки что DLL не найден

Отмечено как Решение begiz 24-09-2019, 21:08:52

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: autoloader 2015
« Ответ #3 : 24-09-2019, 20:18:35 »
соответственно я явно этот C# DLL не подгружаю, просто создаю объекты (окна).
Очень плохо.
3. C# DLL закомпилин с .NET 3.5. для того чтобы работал с версиями ACAD от 2010.
Смесь .NET Framework? Ведь mixed C++ у тебя использует разные .NET Framework для разных версий AutoCAD?

П.С. пробовал загрузить принудительно через System::Reflection::Assembly::LoadFile(fullPath);
загрузился без ошибок, но далее по коду вылезли те же ошибки что DLL не найден
Попробуй подкладывать эту сборку по событию AssemblyResolve - здесь тема: https://adn-cis.org/forum/index.php?topic=8085.msg28508#msg28508
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Re: autoloader 2015
« Ответ #4 : 24-09-2019, 21:02:20 »
ничего не понял почему работают другие версии и почему работает при ручной загрузке, а при автоматической не работает.
но добавил этот код и всё вроде загрузилось.
посмотрю всё ли работает в апликашке

Код - C++ [Выбрать]
  1. Assembly^ CurrentDomain_AssemblyResolve(Object ^ sender, ResolveEventArgs ^ args)
  2. {
  3.         array<System::Reflection::Assembly ^> ^ asms = AppDomain::CurrentDomain->GetAssemblies();
  4.         for (int i = 0; i < asms->Length; ++i)
  5.         {
  6.                 if (asms[i]->FullName == args->Name)
  7.                         return asms[i];
  8.         }
  9.        
  10.         String ^ folderPath = Path::GetDirectoryName(Assembly::GetExecutingAssembly()->Location);
  11.         String ^ assemblyPath = Path::Combine(folderPath, (gcnew AssemblyName(args->Name))->Name + ".dll");
  12.         if (!File::Exists(assemblyPath))
  13.                 return nullptr;
  14.         Assembly ^ assembly = Assembly::LoadFrom(assemblyPath);
  15.         return assembly;
  16. }
  17.  
  18. virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  19.                 // Save critical data pointers before running the constructors (see afxdllx.h for details)
  20.                 AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
  21.                 pModuleState->m_pClassInit = pModuleState->m_classList;
  22.                 pModuleState->m_pFactoryInit = pModuleState->m_factoryList;
  23.                 pModuleState->m_classList.m_pHead = NULL;
  24.                 pModuleState->m_factoryList.m_pHead = NULL;
  25.  
  26.                 DanfossCADDLL.AttachInstance (_hdllInstance) ;
  27.                 InitAcUiDLL () ;
  28.  
  29.                 // You *must* call On_kInitAppMsg here
  30.                 AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;   
  31.  
  32.                 AppDomain ^ currentDomain = AppDomain::CurrentDomain;
  33.                 currentDomain->AssemblyResolve += gcnew ResolveEventHandler(CurrentDomain_AssemblyResolve);
  34.  
  35.                 _session = new CSession();
  36.  
  37.                 return (retCode) ;
  38.         }      
  39.  
  40.  

спасибо!
« Последнее редактирование: 24-09-2019, 22:18:43 от Александр Ривилис »

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: autoloader 2015
« Ответ #5 : 24-09-2019, 22:18:23 »
begiz,
А кто будет форматировать код по правилам???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Re: autoloader 2015
« Ответ #6 : 24-09-2019, 22:35:07 »
Виноват :(
Не посмотрел какой язык кода выбрал.
Причем сам же удивился что выглядит кака то не так.