Управляемый класс-обертка для неуправляемых методов
Управляемый класс-обертка для неуправляемых методов старой бизнес-логики необходим, чтобы объекты 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 в проекте С++».