C++导出函数,C++Invoke再次封装,C#调用

一.C++函数

1.使用VC6新建DLL工程。

2.在头文件中声明函数如:

 extern "C" bool ResrveUniStringEX(const wchar_t* soucrStr, wchar_t* destStr, int nSize);

 extern "C"是一定要加的,而且不要加_stdcall或者_cdecal。

在源文件中实现这个函数。

3.在Def中声明这个函数:

LIBRARY		TestDll_2
EXPORTS
ResrveUniStringEX

Build这个工程,生成TestDll_2.dll和TestDll_2.lib


二.C++ CLR工程

1.使用VC2012新建一个VC++ CLR DLL(类)的工程,在工程中添加lib的引用和头文件:

#include "E:\\WorkSpace_VC_DLL\\TestDll_2\\TestDll_2.h"
#pragma comment(lib, "E:\\WorkSpace_VC_DLL\\TestDll_2\\Debug\\TestDll_2.lib")  
可能还需要设置如下:

项目、属性、C/C++、附加包含目录:填写附加头文件(*.h)所在目录 分号间隔多项
项目、属性、链接器、附加库目录:填写附加依赖库(*.lib)所在目录 分号间隔多项
项目、属性、链接器(点前面的+展开)、输入、附加依赖项:填写附加依赖库的名字.lib 空格间隔多项

Build这个工程,生成ManageCPP.dll


三.新建一个C#的工程,在工程中添加引用(项目->右键->添加引用),浏览到CLR工程中生成的DLL,然后在代码中就能直接使用CLR中定义的类了。在程序运行时,还要要将VC6生成的DLL拷贝到exe的目录下,否则会出错


C#传递Delegate给托管C++,然后在托管C++再转换为函数指针:

1.首先在托管C++中进行委托的声明,这是为了让C#代码调用,如:

		[UnmanagedFunctionPointer(CallingConvention::Cdecl)]
		delegate void ProgressInOCRRecognizeDelegate(UInt16, UInt16, Byte);
2.再在托管C++中进行函数指针的声明,这是为了让C++代码调用:如:

typedef void (__cdecl *pOCRRecognizeCallBackFunc)(UInt16, UInt16, Byte);
3.在托管C++中进行函数声明,如:


                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值