前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >把C++/CLI委托传入本地代码

把C++/CLI委托传入本地代码

作者头像
逍遥剑客
发布2018-05-23 16:01:09
8810
发布2018-05-23 16:01:09
举报

参考: http://resnikb.wordpress.com/2009/05/18/passing-ccli-delegate-to-native-code/

C++/CLI可以直接执行C++, 这个没有问题, 那么反过来呢?

比如底层C++进行一项任务, 完成了需要通知上层的C++/CLI, 总不能在上面不停地查询吧?

通常这是通过回调来实现的, 说漂亮点就是观察者模式, 说成.net的就是委托.

而委托, 本质是就是函数指针. 以前也提到过C++委托的实现.

.net提供了一个方法把委托转换成函数指针: Marshal::GetFunctionPointerForDelegate

 跟String的转换一样, 需要注意保证内存指针不会被托管机制移动/回收.

  1. // DelegateCallback.cpp : main project file.
  2. #include "stdafx.h"
  3. #include <assert.h>
  4. #pragma unmanaged
  5. typedef void (__stdcall* EventCallback)(int);  
  6. class Native  
  7. {  
  8. public:  
  9. /// 注册回调函数
  10. static void RegisterCallback(EventCallback callback)  
  11.     {  
  12.         assert(0 != callback);  
  13.         ms_callback = callback;   
  14.     }  
  15. /// 调用注册的回调函数
  16. static void Invoke(int i)  
  17.     {  
  18.         assert(0 != ms_callback);  
  19.         ms_callback(i);  
  20.     };  
  21. private:  
  22. static EventCallback ms_callback;  
  23. };  
  24. EventCallback Native::ms_callback = 0;  
  25. #pragma managed
  26. using namespace System;  
  27. using namespace System::Runtime::InteropServices;  
  28. public delegate void EventDelegate(int i);  
  29. ref class NativeInterface  
  30. {  
  31. public:  
  32.     NativeInterface()  
  33.     {  
  34. // 从成员函数创建一个委托
  35. this->nativeCallback = gcnew EventDelegate(this, &NativeInterface::Callback);  
  36. // 保证委托不会被内存移动和垃圾回收掉
  37. this->delegateHandle = GCHandle::Alloc(this->nativeCallback);  
  38. // 转换为函数指针注册
  39.         IntPtr ptr = Marshal::GetFunctionPointerForDelegate(this->nativeCallback);  
  40.         Native::RegisterCallback( static_cast<EventCallback>(ptr.ToPointer()) );  
  41.     }  
  42.     ~NativeInterface()  
  43.     {  
  44. // 释放委托句柄
  45. if (this->delegateHandle.IsAllocated)  
  46. this->delegateHandle.Free();  
  47.     }  
  48. private:  
  49. void Callback(int i)  
  50.     {  
  51.         Console::WriteLine("托管命令行输出: {0}", i);  
  52.     }  
  53. private:  
  54.     GCHandle delegateHandle;  
  55.     EventDelegate^ nativeCallback;  
  56. };  
  57. //------------------------------------------------------------------------------
  58. int main(array<System::String^>^ args)  
  59. {  
  60.     NativeInterface^ ni = gcnew NativeInterface();  
  61. // 这个可以在native c++中调用
  62.     Native::Invoke(12345);  
  63. delete ni;  
  64.     ni = nullptr;  
  65. return 0;  
  66. }

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2010年10月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档