C#调用C++
介绍两种方法:
1、P/Invoke
2、CLI
郎涯技术
微信搜一搜:【郎涯技术】关注我。
卖码为生,有代码洁癖。不爱广度,爱深度 — 专注分享Java / 在线教育 / 视音频领域等技术。
想和你一起,每天进步一点点,做一个不凡的人!
展开
-
C++/CLI signing snk文件强命名
C++/CLI 托管C++的托管与非托管字符串的相互转换【1】C++/CLI 托管C++的数据类型介绍【2】C++/CLI 托管C++的基本数据类型及函数【3】C++/CLI 托管C++的数组介绍【4】C++/CLI 托管C++之字符串封装【5】C++/CLI 托管C++之enum枚举封装【6】C++/CLI 托管C++之类、属性封装【7】C++/CLI 托管C++之结构体封装【8】C++/CLI 托管C++之结构体封装(内存对齐#pragma pack)【9】C++/C原创 2015-07-01 17:32:11 · 1739 阅读 · 0 评论 -
C++/CLI 托管C++之导出注释【11】
Git 源码地址将封装好的CLI Dll提供给NET使用时,当然少不了注释的添加。本文就是介绍使用XML注释的方式,获取Dll对应的注释。涉及两点:【1】CLI的成员的注释需要按照标准的方式进行添加,简单点就是C#怎样添加注释///, CLI也要按照同样的方式添加,如下图:/// <summary>/// 1 字符串测试类/// </summary>p...原创 2015-01-01 16:44:56 · 2358 阅读 · 0 评论 -
C++/CLI 托管C++之联合体union封装【10】
Git 源码地址CLI封装Union时,没有对应的类型,使用的是结构体struct,指定每个元素的偏移位置。【1】声明结构体struct时,需要显示指定为Explicit。【2】每个数据需要使用FieldOffsetAttribute指定偏移位置。C++导出函数typedef union _testStru4{ int iValLower; int iValUppe...原创 2015-01-01 16:19:02 · 2013 阅读 · 0 评论 -
C++/CLI 托管C++之结构体封装(内存对齐#pragma pack)【9】
Git 源码地址CLI封装涉及内存对齐的结构体时,使用的是StructLayoutAttribute,指定Pack为1、4、8等属性。【1】C++导出函数,使用 1位对齐#pragma pack(push)#pragma pack(1)typedef struct _testStru2{ int iVal; char cVal; __int64 llVal;}test...原创 2015-01-01 16:08:09 · 3151 阅读 · 0 评论 -
C++/CLI 托管C++之结构体封装【8】
Git 源码地址【1】结构体作为输入输出参数C++导出函数:typedef struct _testStru1{ int iVal; char cVal; __int64 llVal;}testStru1;//4.1 结构体作为输入输出参数EXPORTDLL_CLASS void Struct_Change( testStru1 *pStru ){ if (N...原创 2015-01-01 15:48:23 · 6961 阅读 · 1 评论 -
C++/CLI 托管C++之类、属性封装【7】
Git 源码地址CLI封装类时,涉及确定性析构与非确定性析构,属性封装使用property。【1】C++导出类class EXPORTDLL_CLASS CAddSub{public: CAddSub(){ m_len = 0; } ~CAddSub(){ }public: int Add(int x, int y...原创 2015-01-01 15:41:23 · 5471 阅读 · 1 评论 -
C++/CLI 托管C++之enum枚举封装【6】
Git 源码地址CLI封装枚举类型时,使用eum class/struct。【1】C++封装enum DataEnum{ DATA_READ = 0, DATA_WRITE,};//2.1 枚举类型作为输入参数EXPORTDLL_CLASS int Enum_Output(DataEnum type){ wprintf(L"Enum_Out...原创 2015-01-01 15:32:01 · 4140 阅读 · 1 评论 -
C++/CLI 托管C++之字符串封装【5】
Git 源码地址【1】字符串作为输入参数C++导出函数://1.1 字符串作为输入参数EXPORTDLL_CLASS int Str_Output( WCHAR *pInStr ){ if (NULL == pInStr) { return(-1); } wprintf(L"Str_Output %s\n", pInStr); return(0);}CLI...原创 2015-01-01 15:14:05 · 3082 阅读 · 1 评论 -
C++/CLI 托管C++的数组介绍【4】
Git 源码地址托管数组实际是System::Array 类型的对象,因此在 C++/CLI 程序中创建的托管数组能使用该类提供的各种方法和属性。[1] 定义[qualifiers] [cli::]array<[qualifiers]type[,dimension]> ^var;qualifiers 存储方式说明(可选项)。可选择的存储方式包括:mutable,...原创 2015-01-01 09:20:55 · 11861 阅读 · 0 评论 -
C++/CLI 托管C++的基本数据类型及函数【3】
Git 源码地址在 C++/CLI 扩展中提供了基元数据类型的别名,这些别名与 C++中提供的内置数据类型名相同。提供的主要基元数据类型与(C++/CLI 类型)别名如下:基元数据类型 C++/CLI 类型 说明 Boolean bool 布尔类型 Byte char 8位无符号整数 SByte signed char 8 位...原创 2015-01-01 09:00:23 · 3595 阅读 · 0 评论 -
C++/CLI 托管C++的数据类型介绍【2】
Git 源码地址LI:公共语言基础构造(Common Language Infrastructure),是由ECMA(欧洲计算机制造商协会)成立专家组,并结合ISO标准、开发形成的一个可扩展语言标准。 C++/CLI目的是把C++带到CLI平台上,使C++能够在CLI平台上发挥最大的能力,而并非把C++约束在CLI平台(CLI本身也是ISO标准化的)上。相...原创 2015-01-01 08:52:06 · 3188 阅读 · 0 评论 -
C++/CLI 托管C++的托管与非托管字符串的相互转换【1】
Git 源码地址/VS2005版的托管与非托管的字符串的相互转换使用的是Marshal//之后的版本可以使用Marshaling,该库转换更方便//这里介绍的是VS2005版的使用Marshal的转换方法C# Code 1 2 3 4 5 6 7 8 9 10 11 12 13 ...原创 2014-07-15 16:45:04 · 4714 阅读 · 0 评论 -
C#调用C++ 平台调用P/Invoke 调用约定【一】
Git p-invoke 源码地址【1】C++预定义的宏,使用Unicode字符编码#ifndef EXPORTDLL_EXPORTS #define EXPORTDLL_API extern "C" _declspec(dllimport)#else #define EXPORTDLL_API extern "C" _declspec(dllexport)#endif//!EX...原创 2014-09-18 20:12:15 · 3252 阅读 · 0 评论 -
C#调用C++ 平台调用P/Invoke 函数指针/回调函数【二】
Git p-invoke 源码地址【1】C++代码定义函数指针:typedef int (*PCALLBACKFUN)(int i);定义导出函数,返回函数指针:/************************************************************************//* 2. 函...原创 2014-09-18 20:44:31 · 3493 阅读 · 0 评论 -
C#调用C++ 平台调用P/Invoke 字符串【三】
Git p-invoke 源码地址【1】字符串作为输入参数C++代码:EXPORTDLL_API int Str_Output( WCHAR *pStr ){ if (NULL == pStr) { return(-1); } wprintf(L"Str_Output %s\n", pStr); return(0);}C#代码,定义成string即可:...原创 2014-09-18 20:59:17 · 3355 阅读 · 0 评论 -
C#调用C++ 平台调用P/Invoke 错误码LastError【四】
Git p-invoke 源码地址C++函数中设置的错误码(SetLastError),C#要及时获取怎么办呢?【1】C++代码设置了1010的错误码EXPORTDLL_API void Err_Get(){ SetLastError(1010); //注册表项无效的错误码 wprintf(L"Err_Get \n");}【2】C#代码:需要设置配置参数SetL...原创 2014-09-18 21:33:03 · 1760 阅读 · 0 评论 -
C#调用C++ 平台调用P/Invoke 结构体--输入输出参数、返回值、返出值、结构体数组作为参数【五】
Git p-invoke 源码地址【1】结构体作为输入输出参数C++代码:typedef struct _testStru1{ int iVal; char cVal; __int64 llVal;}testStru1;EXPORTDLL_API void Struct_Change( testStru1 *pStru ){ if (NULL == pStru)...原创 2014-09-20 09:03:09 · 3885 阅读 · 0 评论 -
C#调用C++ 平台调用P/Invoke 结构体--含有内置数据类型的一维、二维数组、字符串指针【六】
Git p-invoke 源码地址【1】结构体中含有内置数据类型的一维数组C++代码:typedef struct _testStru3{ int iValArrp[30]; WCHAR szChArr[30];}testStru3;EXPORTDLL_API void Struct_ChangeArr( testStru3 *pStru ){ if (NULL ...原创 2014-09-20 09:21:46 · 3186 阅读 · 0 评论 -
C#调用C++ 平台调用P/Invoke 结构体--内存对齐方式、union封装【七】
Git p-invoke 源码地址【1】内存对齐方式C++代码:#pragma pack(push)#pragma pack(1)typedef struct _testStru2{ int iVal; char cVal; __int64 llVal;}testStru2;#pragma pack(pop)EXPORTDLL_API void Struct_...原创 2014-09-20 09:58:37 · 2224 阅读 · 0 评论 -
C#调用C++ 平台调用P/Invoke 结构体--结构体嵌套【八】
Git p-invoke 源码地址普通的结构体嵌套很简单,C#中直接定义成对应的结构体即可,这里介绍的是嵌套的结构体以指针的方式表达【1】嵌套结构体指针C++代码:typedef struct _testStru10Pre{ int iVal;}testStru10Pre;typedef struct _testStru10{ testStru10Pre *pP...原创 2014-09-20 10:06:48 · 3050 阅读 · 0 评论