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

19/08/2013

Загрузка управляемой .NET сборки из ObjectARX приложения

Вопрос:

Как загрузить управляемую .NET сборку из ObjectARX приложения?

Ответ:

Чтобы загрузить управляемую сборку из arx-приложения, вы можете использовать экспортируемую из acdbmgd.dll функцию LoadManagedDll.

Сигнатура её: Acad::ErrorStatus LoadManagedDll(const TCHAR* fname)
Вы должны использовать функцию  GetProcAddress, так как мы не обеспечили библиотеку импорта для acmgd.dll:

Код - C++: [Выделить]
  1. typedef Acad::ErrorStatus (__stdcall* funcPtr)(const TCHAR* fname);
  2.  
  3.  static void TestMyNetLoad(void)
  4.  {
  5.   ACHAR fileName[MAX_PATH];
  6.  
  7.   if( RTNORM != acedGetString(true, _T("\nПолный путь к DLL-файлу: "), fileName) )
  8.   {
  9.    acutPrintf(_T("\nЧто-то не то с вводом пути к файлу!"));
  10.    return;
  11.   }
  12.  
  13.   HMODULE hAcMgd = ::GetModuleHandle(_T("ACDBMGD.DLL"));
  14.  
  15.   funcPtr pLoadMgd = (funcPtr)::GetProcAddress(hAcMgd, "LoadManagedDll");
  16.  
  17.   if( pLoadMgd )
  18.   {
  19.    Acad::ErrorStatus es = (*pLoadMgd)(fileName);
  20.    if( es != Acad::eOk )
  21.    {
  22.     acutPrintf(_T("\nОшибка в загрузке .NET DLL!"));
  23.     return;
  24.    }
  25.   }
  26.   else
  27.   {
  28.    acutPrintf(_T("\nОшибка получения указателя функции LoadManagedDll()!"));
  29.    return;
  30.   }
  31.  }

 

Примечание переводчика:

Можно всё сделать несколько проще, так как в действительности библиотека acdbmgd.lib экспортирует функцию LoadManagedDll:

Код - C++: [Выделить]
  1. enum Acad::ErrorStatus __stdcall LoadManagedDll(ACHAR const *path);
  2. static int ads_loadacadnet(void)
  3. {
  4.   struct resbuf *pArgs = acedGetArgs () ;
  5.   acedRetNil();
  6.   if (pArgs && pArgs->restype == RTSTR) {
  7.     Acad::ErrorStatus es = LoadManagedDll(pArgs->resval.rstring);
  8.     if (es != Acad::eOk) {
  9.       acutPrintf(_T("\nLoadManagedDll(\"%s\")=%s"),
  10.       pArgs->resval.rstring,acadErrorStatusText(es));
  11.     } else acedRetStr(pArgs->resval.rstring);
  12.   }
  13.   return (RSRSLT) ;
  14. }


Источник: http://adndevblog.typepad.com/autocad/2012/10/load-a-net-managed-assembly-from-an-objectarx-application.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=173

Опубликовано 19.08.2013
Отредактировано 19.08.2013 в 14:36:03