博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#调用C++接口返回字符串的做法
阅读量:5840 次
发布时间:2019-06-18

本文共 1987 字,大约阅读时间需要 6 分钟。

作者:朱金灿

来源:

 

        现在有这样一种情景,假如C#调用C++接口需要返回一个字符串。因为字符串是不定长的,因此传递一个定长的字符串进去是不合适的。

 

        因此需要一种间接的做法,简单来说就是C#定义一个创建空字符串的接口,传递这个接口指针给C++模块,然后在C++模块中调用这个C#接口创建一个空的字符串接口。然后在传递字符串时先调用这个C#接口创建一个空字符串,然后再填充字符串。具体的代码如何:

#region 本段代码可放在其他位置,但保证系统启动后能初始化        static protected StringHelper swigStringHelper = new StringHelper(); // 系统初始化时先调用        protected class StringHelper        {            public delegate string StringDelegate(string message);            static StringDelegate stringDelegate = new StringDelegate(CreateString);// AlgoDemo为C++模块,RegisterStringCallback为创建字符串的注册回调函数[DllImport("AlgoDemo", EntryPoint = "RegisterStringCallback")]            public static extern void RegisterStringCallback(StringDelegate stringDelegate);            static string CreateString(string cString)            {                return cString;            }            static StringHelper()            {                RegisterStringCallback(stringDelegate);            }        }// C#程序调用处  private void btnExcute_Click(object sender, EventArgs e)        {            string strOut = "";            string strResult = Algo.ExcuteAlgo("C#调用C++测试!", 0, ref strOut);            MessageBox.Show(strOut);        }
// C++模块的注册回调函数typedef char * (__stdcall* StringHelperCallback)(const char *);static StringHelperCallback g_csharp_string_callback = NULL;extern "C" __declspec(dllexport) void RegisterStringCallback(StringHelperCallback callback) {	g_csharp_string_callback = callback;}// C++接口char* ExcuteAlgo(const char* strFileName,int arg0,char** strOut){	char* result;	TestAlgo algo;	std::string strInput(strFileName);	std::string strResult = algo.DoSomething(strFileName,arg0);	// 此处需要注意,由调用方开辟空间	result = "中文测试!!";	std::string strTemp = "输出字符串测试。。。";	for(int i=0;i<500;i++)	{		strTemp += "多加一点数据...!!";	}	    if(NULL==g_csharp_string_callback)		return NULL;     // 把C++字符串传递给空的C#字符串	*strOut =  g_csharp_string_callback(strTemp.c_str());	return result;}

         代码示例工程见: 。

转载于:https://www.cnblogs.com/lanzhi/p/6469898.html

你可能感兴趣的文章
C#中的Marshal
查看>>
linux命令:ls
查看>>
Using RequireJS in AngularJS Applications
查看>>
【SAP HANA】关于SAP HANA中带层次结构的计算视图Cacultation View创建、激活状况下在系统中生成对象的研究...
查看>>
【ros】Create a ROS package:package dependencies报错
查看>>
通过容器编排和服务网格来改进Java微服务的可测性
查看>>
Linux基础命令---rmdir
查看>>
Java I/O操作
查看>>
灰度图像和彩色图像
查看>>
argparse - 命令行选项与参数解析(转)
查看>>
修改上一篇文章的node.js代码,支持默认页及支持中文
查看>>
java只能的round,ceil,floor方法的使用
查看>>
采用JXL包进行EXCEL数据写入操作
查看>>
将txt文件转化为json进行操作
查看>>
我的2014-相对奢侈的生活
查看>>
Java设计模式
查看>>
华为OJ 名字美丽度
查看>>
mysql-This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决
查看>>
基本概念复习
查看>>
通过Roslyn构建自己的C#脚本(更新版)(转)
查看>>