Windows - статьи

       

Управляемый класс-обертка для неуправляемых методов


Управляемый класс-обертка для неуправляемых методов старой бизнес-логики необходим, чтобы объекты delegate из remoting-объекта могли вызывать неуправляемые методы бизнес-логики. Это связано с тем, что невозможно напрямую передать в delegate ссылку на неуправляемый метод.

Основная сложность написания такого управляемого класса-обертки связана с необходимостью корректного преобразования данных неуправляемых и управляемых типов.

Входным параметром  при создании экземпляра управляемого класса-обертки для неуправляемых методов является указатель на существующий (неуправляемый) объект,  которому принадлежат методы бизнес-логики. Поэтому,  в заголовочный файл класса-обертки включаются #include описания старого класса бизнес-логики.

Таким образом, для его реализации в рамках рассматриваемого примера в состав старого проекта на родном C++ добавляются файлы MngCover.h и MngCover.cpp со следующим кодом на C++/CLI:

  //MngCover.h //Управляемый класс-обертка для неуправляемых методов   #if !defined(AFX_MNGCOVER__INCLUDED_) #define AFX_MNGCOVER__INCLUDED_   #include "stdafx.h" #include "MFC_2Dlg.h" //описание бизнес-логики #include <string>   #using <mscorlib.dll> using namespace System; using namespace std;   public ref class CMngCover {         CMFC_2Dlg* m_pDialog; //неуправляемый объект бизнес-логики public:         //конструктор         CMngCover(CMFC_2Dlg* pDialog);         //обертка метода method_PutStr         void mng_method_PutStr(System::String^ str);         //обертка метода method_GetStr         String^ mng_method_GetStr(); };   #endif // defined(AFX_MNGCOVER__INCLUDED_)

// MngCover.cpp // Управляемый класс-обертка для неуправляемых методов   #include "mngCover.h" #include <vcclr.h> #using <mscorlib.dll>   using namespace System; using namespace std;   //конструктор CMngCover::CMngCover(CMFC_2Dlg* pDialog):m_pDialog(pDialog){};   //обертка метода method_PutStr void CMngCover::mng_method_PutStr(System::String^ str){         pin_ptr <const wchar_t> ptr = PtrToStringChars(str);         m_pDialog->method_PutStr(ptr); };   //обертка метода method_GetStr String^ CMngCover::mng_method_GetStr(){         String^ mm_s;         mm_s = gcnew String( m_pDialog->method_GetStr() );         return mm_s; };  

Класс CMngCover  должен быть откомпилирован с поддержкой CLR, поэтому для него необходимо выполнить настройки, описанные в разделе «Модули на С++/CLI в проекте С++».



Содержание раздела