tags:

views:

55

answers:

2

Hi all. We have a plugin system here, written in c++. Now that this has to have an ability to upgrade plugins(which are COM) we need to unload the plugin, install the plugin and then load it again. Now the problem is that this has to happen without closing an app. c++ COM dlls get unloaded pretty good but .NET ones not. Here's the sample code I'm using to load/unload the COM.

#include "stdafx.h"
#import "C:\Projects\MyTLBWithInterface.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids


int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(0);

    try
    {
     CLSID rclsid;


     HRESULT  hr = CLSIDFromProgID(_T("MY_NET_COM"), &rclsid);

     if (hr != S_OK)
     {
      return false;
     }

     IMYInterfaceForCom *cpi =NULL;

     hr = CoCreateInstance(rclsid, 0, CLSCTX_ALL, __uuidof(IUnknown),reinterpret_cast<void**>(&cpi));

     if (SUCCEEDED(hr)) 
     {

      BSTR  name;
      cpi->GetName(&pluginName);
       MessageBox(0,pluginName, L"MyApp", MB_OK|MB_ICONERROR);

      ULONG CC = cpi->Release();

      CoFreeUnusedLibraries();
     }

    }
    catch(_com_error & e)
    {
     _bstr_t bstrSource(e.Source());
     _bstr_t bstrDescription(e.Description());
     printf("\nException:\n\tSource : %s \n\tDescription : %s \n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }
    catch(...)
    {
     printf("\nException");
    }

    CoUninitialize();
    return 0;

}
+1  A: 

I would not support .NET plugins for the reasons I describe in this post

DrPizza
Agree. RUn them as out-of-process COM components
MSalters
A: 

Resolved via this thread

Revenge