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

本文共 1937 字,大约阅读时间需要 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;}

         代码示例工程见: 。

转载地址:http://rdimb.baihongyu.com/

你可能感兴趣的文章
【计算机网络】计算机网络知识总结
查看>>
【Java】【Web】JavaWeb相关知识总结 2018-9-17
查看>>
【数据库】突破单一数据库的性能限制——数据库-分库分表总结 2018-9-20
查看>>
Slurm——作业调度处理
查看>>
Lustre 维护
查看>>
Lustre 操作
查看>>
Lustre—配置和管理磁盘配额
查看>>
Lustre—磁盘配额测试
查看>>
SSH加密密码中的非对称式密码学
查看>>
Mac Redis安装入门教程
查看>>
python3安装教程配置配置阿里云
查看>>
Mac快捷键和实用技巧
查看>>
Git的多人协作和分支处理测试
查看>>
mysql索引回表
查看>>
iterm2 保存阿里云登陆并防止断开连接
查看>>
brew安装
查看>>
centos 无法连接网络
查看>>
mysql5.7初始密码查看及密码重置
查看>>
go语言实现2048小游戏(完整代码)
查看>>
动态二维码免费制作
查看>>