Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: begiz от 24-09-2019, 19:36:20

Название: autoloader 2015
Отправлено: begiz от 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() уже проверил, там всё ок.

Название: Re: autoloader 2015
Отправлено: Александр Ривилис от 24-09-2019, 19:52:46
А теперь всё тоже самое, но подробнее.
1. Это mixed C++ - это dll-файл, который грузит в свою очередь C# dll-файл? Если да, то как он грузит. Если нет, то как происходит загрузка этих модулей? Пока ничего непонятно.
2. Установлены ли все обновления для AutoCAD 2015? Если нет - установить.
3. Нет ли путаницы с версиями .NET Framework?
4. C#-модуль использует AutoCAD .NET API?
Название: Re: autoloader 2015
Отправлено: begiz от 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 не найден
Название: Re: autoloader 2015
Отправлено: Александр Ривилис от 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
Название: Re: autoloader 2015
Отправлено: begiz от 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.  

спасибо!
Название: Re: autoloader 2015
Отправлено: Александр Ривилис от 24-09-2019, 22:18:23
begiz,
А кто будет форматировать код по правилам???
Название: Re: autoloader 2015
Отправлено: begiz от 24-09-2019, 22:35:07
Виноват :(
Не посмотрел какой язык кода выбрал.
Причем сам же удивился что выглядит кака то не так.