作者:朱金灿

来源:http://blog.csdn.net/clever101

现在有这样一种情景,假如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;
}

代码示例工程见: C#调用C++接口示例

最新文章

  1. Web jquery表格组件 JQGrid 的使用 - 8.Pager、新增数据、查询、刷新、查看数据
  2. ionic2 图片上传
  3. 大数据之tachyon(未完版)
  4. Java基础-基本数据类型转换案例
  5. KEIL C51中const和code的使用
  6. idea不能加载xml
  7. sitemap.xml 的 几个东西
  8. linux-Centos6.5中nginx1.63源码安装
  9. Linux服务器下Java环境搭建
  10. js原型对象
  11. Spring中@Transactional事务回滚(含实例详细讲解,附源码)
  12. Windows + Flask + Apache + wsgi踏坑总结
  13. MySQL数据库导入错误:ERROR 1064 (42000) 和 ERROR at line xx:
  14. luogu4159 迷路 (矩阵加速)
  15. android用TextView实现跑马灯效果
  16. SpringBatch Sample (三)(XML文件操作)
  17. Python高阶函数_map/reduce/filter函数
  18. static,final的用法
  19. 2019.01.20 bzoj3999: [TJOI2015]旅游(树链剖分)
  20. iOS 中的各种锁

热门文章

  1. spring cloud之简单介绍
  2. Jasper-template
  3. 【opencv学习笔记三】opencv3.4.0数据类型解释
  4. 用python监控您的window服务
  5. linux命令:gzip命令
  6. linux私有ftp搭建与创建新用户
  7. MVN&amp;nbsp;命令行
  8. 算法java实现--回溯法--图的m着色问题
  9. CSS实现三角形图标原理解析
  10. Open-source Tutorial - NLog