24/06/2013
Как загрузить из неуправляемого arx-приложения управляемую .NET сборку в AutoCAD?
Вопрос: У меня есть arx-приложение и dll-сборка (.NET-сборка). Я бы хотел загружать dll-сборку в AutoCAD непосредственно из arx-приложения, а не использовать отложенную загрузку меняя ключи реестра или команду _NETLOAD. Я пробовал функцию acrxDynamicLinker->loadModule(), но она не работает с управляемыми сборками.
Ответ: acdbmgd.dll экспортирует недокументированную функцию LoadManagedDll, которая и позволяет загружать из неуправляемого arx-приложения управляемую dll-сборку. Пример её использования:
Код - C++: [Выделить]
- #include "StdAfx.h"
- #include "resource.h"
- enum Acad::ErrorStatus __stdcall LoadManagedDll(ACHAR const *path);
- //--------------------------------------------------------------
- #define szRDS _RXST("")
- //--------------------------------------------------------------
- //----- ObjectARX EntryPoint
- class CLoadManagedApp : public AcRxArxApp {
- public:
- CLoadManagedApp () : AcRxArxApp () {}
- virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
- AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg (pkt) ;
- return (retCode) ;
- }
- virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
- AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg (pkt) ;
- return (retCode) ;
- }
- virtual void RegisterServerComponents () {
- }
- // - LoadManaged.MyNetLoad command (do not rename)
- static void LoadManagedMyNetLoad(void)
- {
- // Add your code for command LoadManaged.MyNetLoad here
- const ACHAR * dlgname = _T("Select Managed DLL");
- resbuf* result = NULL;
- if (acedGetFileNavDialog(NULL, NULL, _T("dll"),
- dlgname, 4096 , &result) == RTNORM && result) {
- resbuf *rb = result;
- for (resbuf *rb = result; rb; rb = rb->rbnext) {
- if (rb->restype == RTSTR) {
- LoadManagedDll(rb->resval.rstring);
- }
- }
- }
- acutRelRb(result);
- }
- // ----- ads_netload symbol (do not rename)
- static int ads_netload(void)
- {
- struct resbuf *pArgs = acedGetArgs () ;
- acedRetNil();
- if (pArgs && pArgs->restype == RTSTR) {
- Acad::ErrorStatus es = LoadManagedDll(pArgs->resval.rstring);
- if (es != Acad::eOk) {
- acutPrintf(_T("\nLoadManagedDll(\"%s\")=%s"),
- pArgs->resval.rstring,acadErrorStatusText(es));
- } else
- acedRetStr(pArgs->resval.rstring);
- }
- return (RSRSLT) ;
- }
- } ;
- //--------------------------------------------------------------
- IMPLEMENT_ARX_ENTRYPOINT(CLoadManagedApp)
- ACED_ARXCOMMAND_ENTRY_AUTO(CLoadManagedApp, LoadManaged, MyNetLoad, MyNetLoad, ACRX_CMD_TRANSPARENT, NULL)
- ACED_ADSSYMBOL_ENTRY_AUTO(CLoadManagedApp, netload, true)
Обсуждение: http://adn-cis.org/forum/index.php?topic=107.0
Автор: Александр Ривилис
Автор перевода: Александр Ривилис
Опубликовано 24.06.2013
Отредактировано 24.06.2013 в 17:20:39
Автор перевода: Александр Ривилис
Опубликовано 24.06.2013
Отредактировано 24.06.2013 в 17:20:39