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

24/06/2013

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

Вопрос: У меня есть arx-приложение и dll-сборка (.NET-сборка). Я бы хотел загружать dll-сборку в AutoCAD непосредственно из arx-приложения, а не использовать отложенную загрузку меняя ключи реестра или команду _NETLOAD. Я пробовал функцию acrxDynamicLinker->loadModule(), но она не работает с управляемыми сборками.

 

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

 

Код - C++: [Выделить]
  1. #include "StdAfx.h"
  2. #include "resource.h"
  3.  
  4. enum Acad::ErrorStatus __stdcall LoadManagedDll(ACHAR const *path);
  5.  
  6. //--------------------------------------------------------------
  7. #define szRDS _RXST("")
  8.  
  9. //--------------------------------------------------------------
  10. //----- ObjectARX EntryPoint
  11. class CLoadManagedApp : public AcRxArxApp {
  12.  
  13. public:
  14.   CLoadManagedApp () : AcRxArxApp () {}
  15.  
  16.   virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  17.     AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg (pkt) ;
  18.     return (retCode) ;
  19.   }
  20.  
  21.   virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  22.     AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg (pkt) ;
  23.     return (retCode) ;
  24.   }
  25.  
  26.   virtual void RegisterServerComponents () {
  27.   }
  28.  
  29.  
  30.   // - LoadManaged.MyNetLoad command (do not rename)
  31.   static void LoadManagedMyNetLoad(void)
  32.   {
  33.     // Add your code for command LoadManaged.MyNetLoad here
  34.     const ACHAR * dlgname = _T("Select Managed DLL");
  35.     resbuf* result = NULL;
  36.     if (acedGetFileNavDialog(NULL, NULL, _T("dll"),
  37.             dlgname, 4096 , &result) == RTNORM && result) {
  38.       resbuf *rb = result;
  39.       for (resbuf *rb = result; rb; rb = rb->rbnext) {
  40.         if (rb->restype == RTSTR) {
  41.           LoadManagedDll(rb->resval.rstring);
  42.         }
  43.       }
  44.  
  45.     }
  46.     acutRelRb(result);
  47.   }
  48.  
  49.   // ----- ads_netload symbol (do not rename)
  50.   static int ads_netload(void)
  51.   {
  52.     struct resbuf *pArgs = acedGetArgs () ;
  53.     acedRetNil();
  54.     if (pArgs && pArgs->restype == RTSTR) {
  55.       Acad::ErrorStatus es = LoadManagedDll(pArgs->resval.rstring);
  56.       if (es != Acad::eOk) {
  57.         acutPrintf(_T("\nLoadManagedDll(\"%s\")=%s"),
  58.           pArgs->resval.rstring,acadErrorStatusText(es));
  59.       } else
  60.         acedRetStr(pArgs->resval.rstring);
  61.     }
  62.     return (RSRSLT) ;
  63.   }
  64. } ;
  65.  
  66. //--------------------------------------------------------------
  67. IMPLEMENT_ARX_ENTRYPOINT(CLoadManagedApp)
  68.  
  69. ACED_ARXCOMMAND_ENTRY_AUTO(CLoadManagedApp, LoadManaged, MyNetLoad, MyNetLoad, ACRX_CMD_TRANSPARENT, NULL)
  70. ACED_ADSSYMBOL_ENTRY_AUTO(CLoadManagedApp, netload, true)
  71.  

 

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

Автор: Александр Ривилис
Автор перевода: Александр Ривилис
Опубликовано 24.06.2013
Отредактировано 24.06.2013 в 17:20:39