Регистрация remoting-объекта
Превращение любого приложения в remoting-сервер всегда начинается с подключения remoting-объекта в качестве Reference. Это выполняется следующим образом: необходимо навести курсор на имя проекта будущего remoting-сервера в окне Solution Explorer в VS и, нажав правую кнопку мыши, выбрать Properties. В открывшемся окне нажать кнопку «Add New Reference» и в закладке «Browse» выбрать dll-файл remoting-объекта.
После этого можно приступить к созданию класса регистрации remoting-объекта. Для этого к старому проекту на родном C++ добавляются файлы Rmt_reg.h и Rmt_reg.cpp со следующим кодом на C++/CLI:
//Rmt_reg.h //регистрация remoting-объекта #include "stdafx.h" #include "mngCover.h" // Управляемый класс-обертка для неуправляемых методов #using <mscorlib.dll> #using <System.Dll> #using <System.Runtime.Remoting.Dll> using namespace System; using namespace System::Runtime; using namespace System::Runtime::Remoting; using namespace System::Runtime::Remoting::Channels; using namespace System::Runtime::Remoting::Channels::Tcp; using namespace Rmt_obj; //пространтво имен remoting-объекта namespace Rmt_reg { public ref class CRmtReg { private: TcpChannel^ m_chan; public: CRmtReg(CMngCover^ pMngCover); //конструктор }; }
// Rmt_reg.cpp //регистрация remoting-объекта #include "Rmt_reg.h" using namespace System; using namespace System::Runtime; using namespace System::Runtime::Remoting; using namespace System::Runtime::Remoting::Channels; using namespace System::Runtime::Remoting::Channels::Tcp; namespace Rmt_reg { CRmtReg::CRmtReg(CMngCover^ pMngCover) //конструктор { m_chan = gcnew TcpChannel(8085); //создаем канал ChannelServices::RegisterChannel(m_chan, false); //регистрируем //описание переменной remoting-класса CRmtngObj^ rmClass; rmClass = gcnew CRmtngObj(); //создание remoting-класса // регистрация remoting-класса ObjRef^ refClass = RemotingServices::Marshal(rmClass, "RemoteTest"); // инициализация delegate для метода method_PutStr rmClass->ev_method_PutStr += gcnew CRmtngObj:: dlg_method_PutStr(pMngCover, &(CMngCover::mng_method_PutStr) ); // инициализация delegate для метода method_GetStr rmClass-> ev_method_GetStr += gcnew CRmtngObj:: dlg_method_GetStr(pMngCover, &(CMngCover::mng_method_GetStr) ); }; }
Класс регистрации remoting-объекта должен не только его зарегистрировать, но и создав, выполнить его инициализацию. Для этого используется уже созданный объект управляемого класса-обертки неуправляемых методов, поэтому в заголовочный файл «Класса регистрации remoting-объекта» добавлен #include на описание класса-обертки.
Класс регистрации remoting-объекта реализуется на управляемом коде (порядок включения режима компиляции с поддержкой CLR описан выше в разделе «Модули на С++/CLI в проекте С++»).