public class Service { public void Add(Int32 a, Int32 b) { Console.WriteLine("Hello from Managed Code!"); Console.WriteLine(String.Format("Result: {0}", a + b)); } }
// , // #ifdef INSIDE_MANAGED_CODE # define DECLSPECIFIER __declspec(dllexport) # define EXPIMP_TEMPLATE #else # define DECLSPECIFIER __declspec(dllimport) # define EXPIMP_TEMPLATE extern #endif namespace MixedLibrary { class DECLSPECIFIER CppService { public: CppService(); virtual ~CppService(); public: void Add(int a, int b); private: void * m_impl; }; }
#include "CppService.h" using namespace System; using namespace System::Runtime::InteropServices; using namespace SimpleLibrary; namespace MixedLibrary { CppService::CppService() { Service^ service = gcnew Service(); m_impl = GCHandle::ToIntPtr(GCHandle::Alloc(service)).ToPointer(); } CppService::~CppService() { GCHandle handle = GCHandle::FromIntPtr(IntPtr(m_impl)); handle.Free(); } void CppService::Add(int a, int b) { GCHandle handle = GCHandle::FromIntPtr(IntPtr(m_impl)); Service^ service = safe_cast<Service^>(handle.Target); service->Add(a, b); } }
#include "stdafx.h" #pragma comment(lib, "../Debug/MixedLibrary.lib") #include <iostream> #include "../MixedLibrary/CppService.h" using namespace std; using namespace MixedLibrary; int main() { CppService* service = new CppService(); service->Add(5, 6); cout << "press any key..." << endl; getchar(); }
Source: https://habr.com/ru/post/335620/
All Articles