Можно ли получить перечень загруженных dll

Автор Тема: Можно ли получить перечень загруженных dll  (Прочитано 828 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 3
  • Карма: 0
Знаю, что список загруженных в автокад arx можно извлечь через acedArxLoaded()
А как быть если нужно вытянуть список подгруженных dll (сборки .NET)?


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

  • Administrator
  • *****
  • Сообщений: 9610
  • Карма: 1226
  • Рыцарь ObjectARX
  • Skype: rivilis
Это нужно сделать из ObjectARX (native C++)? Для этого готовых методов нет. Есть метод для загрузки .NET-сборки:
Код - C++ [Выбрать]
  1. enum Acad::ErrorStatus __cdecl LoadManagedDll(wchar_t const *); // x64
Код - C++ [Выбрать]
  1. enum Acad::ErrorStatus __stdcall LoadManagedDll(wchar_t const *); // x86
« Последнее редактирование: 11-01-2019, 20:34:50 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 3
  • Карма: 0
Александр, спасибо!

Хотелось бы  для native c++ проверять, но если так нельзя
может есть способ из managed c++?

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

  • Administrator
  • *****
  • Сообщений: 9610
  • Карма: 1226
  • Рыцарь ObjectARX
  • Skype: rivilis
Из mixed/managed C++ - очень просто:



Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //----- acrxEntryPoint.cpp
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include "resource.h"
  6. using namespace System;
  7. using namespace System::Reflection;
  8. using namespace Autodesk::AutoCAD::ApplicationServices;
  9. using namespace Autodesk::AutoCAD::DatabaseServices;
  10. using namespace Autodesk::AutoCAD::EditorInput;
  11.  
  12.  
  13. //-----------------------------------------------------------------------------
  14. #define szRDS _RXST("")
  15.  
  16. //-----------------------------------------------------------------------------
  17. //----- ObjectARX EntryPoint
  18. class CGetLoadedApp : public AcRxArxApp {
  19.  
  20. public:
  21.   CGetLoadedApp() : AcRxArxApp() {}
  22.  
  23.   virtual AcRx::AppRetCode On_kInitAppMsg(void *pkt) {
  24.     AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
  25.     return (retCode);
  26.   }
  27.  
  28.   virtual AcRx::AppRetCode On_kUnloadAppMsg(void *pkt) {
  29.     AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);
  30.     return (retCode);
  31.   }
  32.  
  33.   virtual void RegisterServerComponents() {  }
  34.  
  35.   static void RivilisGetLoadedMGD() {
  36.     Document^ doc = Application::DocumentManager->MdiActiveDocument;
  37.  
  38.     if (doc == nullptr) return;
  39.     Editor^ ed = doc->Editor;
  40.     for each (Assembly^ ass in AppDomain::CurrentDomain->GetAssemblies())
  41.     {
  42.       ed->WriteMessage("\nName = {0}", ass->GetName(false)->Name);
  43.       ed->WriteMessage("\n\tFull Name = {0}", ass->FullName);
  44.       try  {
  45.         ed->WriteMessage("\n\tLocation = {0}", ass->Location);
  46.       }
  47.       catch (...) {
  48.         ed->WriteMessage("\n\tNo Location. Possible dynamic assembly");
  49.       };
  50.     }
  51.   }
  52. };
  53.  
  54. //-----------------------------------------------------------------------------
  55. IMPLEMENT_ARX_ENTRYPOINT(CGetLoadedApp)
  56.  
  57. ACED_ARXCOMMAND_ENTRY_AUTO(CGetLoadedApp, Rivilis, GetLoadedMGD, GetLoadedMGD, ACRX_CMD_MODAL, NULL)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение RrRR 15-01-2019, 11:12:59

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

  • Administrator
  • *****
  • Сообщений: 9610
  • Карма: 1226
  • Рыцарь ObjectARX
  • Skype: rivilis
Я попробовал получить все сборки, загруженные в AutoCAD из native C++ на основе вот этого метода:
https://blogs.msdn.microsoft.com/calvin_hsia/2013/12/05/use-reflection-from-native-c-code-to-run-managed-code/
И похоже что работает:

Вот код:

Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //----- acrxEntryPoint.cpp
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include "resource.h"
  6. #include "atlsafe.h"
  7.  
  8. #import <mscorlib.tlb> raw_interfaces_only rename("ReportEvent","ReportEventManaged")
  9.  
  10. #include <metahost.h>
  11. #pragma comment(lib,"mscoree.lib")
  12. #include <mscoree.h>
  13. #include <comdef.h>
  14.  
  15. using namespace mscorlib;
  16.  
  17. //-----------------------------------------------------------------------------
  18. #define szRDS _RXST("")
  19.  
  20. //-----------------------------------------------------------------------------
  21. //----- ObjectARX EntryPoint
  22. class CGetMgdFromNativeApp : public AcRxArxApp {
  23.  
  24. public:
  25.   CGetMgdFromNativeApp() : AcRxArxApp() {}
  26.  
  27.   virtual AcRx::AppRetCode On_kInitAppMsg(void *pkt) {
  28.     AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
  29.     return (retCode);
  30.   }
  31.  
  32.   virtual AcRx::AppRetCode On_kUnloadAppMsg(void *pkt) {
  33.     AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);
  34.     return (retCode);
  35.   }
  36.  
  37.   virtual void RegisterServerComponents() {
  38.     //----- Self-register COM server upon loading.
  39.     if (FAILED(::DllRegisterServer()))
  40.       acutPrintf(_RXST("Failed to register COM server.\n"));
  41.   }
  42.  
  43.   static void RivilisGetManagedDlls() {
  44.     // Put your command code here
  45.     CComPtr<ICLRMetaHost> spClrMetaHost;
  46.     // get a MetaHost
  47.     HRESULT hr = CLRCreateInstance(
  48.       CLSID_CLRMetaHost,
  49.       IID_PPV_ARGS(&spClrMetaHost)
  50.     );
  51.     _ASSERT(hr == S_OK);
  52.  
  53.     // get a particular runtime version
  54.     CComPtr<ICLRRuntimeInfo> spCLRRuntimeInfo;
  55.     hr = spClrMetaHost->GetRuntime(L"v4.0.30319",
  56.       IID_PPV_ARGS(&spCLRRuntimeInfo)
  57.     );
  58.     _ASSERT(hr == S_OK);
  59.  
  60.     // get the CorRuntimeHost
  61.     CComPtr<ICorRuntimeHost> spCorRuntimeHost;
  62.     hr = spCLRRuntimeInfo->GetInterface(
  63.       CLSID_CorRuntimeHost,
  64.       IID_PPV_ARGS(&spCorRuntimeHost)
  65.     );
  66.     _ASSERT(hr == S_OK);
  67.  
  68.     // Start the CLR
  69.     hr = spCorRuntimeHost->Start();
  70.     _ASSERT(hr == S_OK);
  71.  
  72.     // get the Default app domain as an IUnknown
  73.     CComPtr<IUnknown> spAppDomainThunk;
  74.     hr = spCorRuntimeHost->GetDefaultDomain(&spAppDomainThunk);
  75.     _ASSERT(hr == S_OK);
  76.  
  77.     // convert the Appdomain IUnknown to a _AppDomain
  78.     CComPtr<_AppDomain> spAppDomain;
  79.     hr = spAppDomainThunk->QueryInterface(IID_PPV_ARGS(&spAppDomain));
  80.     _ASSERT(hr == S_OK);
  81.     SAFEARRAY *pAssemblyArray = NULL;
  82.     hr = spAppDomain->GetAssemblies(&pAssemblyArray);
  83.     _ASSERT(hr == S_OK);
  84.  
  85.     CComSafeArray<IUnknown*> csaAssemblies;
  86.     csaAssemblies.Attach(pAssemblyArray);
  87.     long cAssemblies = csaAssemblies.GetCount();
  88.     for (long i = 0; i < cAssemblies; i++)
  89.     {
  90.       CComPtr<_Assembly> spAssembly;
  91.       spAssembly = csaAssemblies[i];
  92.       if (spAssembly == NULL)
  93.         continue;
  94.       CComBSTR asmFullName;
  95.       hr = spAssembly->get_FullName(&asmFullName);
  96.       if (FAILED(hr))
  97.         continue;
  98.       acutPrintf(L"\nFull Name:%s", asmFullName);
  99.       CComBSTR asmLocatation;
  100.       hr = spAssembly->get_Location(&asmLocatation);
  101.       if (!FAILED(hr))
  102.         acutPrintf(L"\n\tLocation: %s", asmLocatation);
  103.       else
  104.         acutPrintf(L"\n\tLocation not found");
  105.     }
  106.  
  107.     hr = spCorRuntimeHost->Stop();
  108.     _ASSERT(hr == S_OK);
  109.  
  110.   }
  111.  
  112. };
  113.  
  114. //-----------------------------------------------------------------------------
  115. IMPLEMENT_ARX_ENTRYPOINT(CGetMgdFromNativeApp)
  116.  
  117. ACED_ARXCOMMAND_ENTRY_AUTO(CGetMgdFromNativeApp, Rivilis, GetManagedDlls, GetManagedDlls, ACRX_CMD_MODAL, NULL)


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 3
  • Карма: 0
Александр, спасибо!
Похоже, то что надо! :)