C#调用C++接口返回字符串的做法

本文介绍了一种C#调用C++接口并返回不定长字符串的方法。通过C#定义的StringHelper类与C++模块交互,实现字符串的动态创建与传递,解决了跨语言调用中字符串长度不确定的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

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

  1.  #region 本段代码可放在其他位置,但保证系统启动后能初始化  
  2.         static protected StringHelper swigStringHelper = new StringHelper(); // 系统初始化时先调用  
  3.         protected class StringHelper  
  4.         {  
  5.             public delegate string StringDelegate(string message);  
  6.             static StringDelegate stringDelegate = new StringDelegate(CreateString);  
  7. // AlgoDemo为C++模块,RegisterStringCallback为创建字符串的注册回调函数  
  8. [DllImport("AlgoDemo", EntryPoint = "RegisterStringCallback")]  
  9.             public static extern void RegisterStringCallback(StringDelegate stringDelegate);  
  10.   
  11.             static string CreateString(string cString)  
  12.             {  
  13.                 return cString;  
  14.             }  
  15.   
  16.             static StringHelper()  
  17.             {  
  18.                 RegisterStringCallback(stringDelegate);  
  19.             }  
  20.         }  
  21.   
  22. // C#程序调用处  
  23.   private void btnExcute_Click(object sender, EventArgs e)  
  24.         {  
  25.             string strOut = "";  
  26.             string strResult = Algo.ExcuteAlgo("C#调用C++测试!", 0, ref strOut);  
  27.             MessageBox.Show(strOut);  
  28.         }  

 

  1. // C++模块的注册回调函数  
  2. typedef char * (__stdcall* StringHelperCallback)(const char *);  
  3. static StringHelperCallback g_csharp_string_callback = NULL;  
  4.   
  5. extern "C" __declspec(dllexport) void RegisterStringCallback(StringHelperCallback callback) {  
  6.     g_csharp_string_callback = callback;  
  7. }  
  8. // C++接口  
  9. char* ExcuteAlgo(const char* strFileName,int arg0,char** strOut)  
  10. {  
  11.     char* result;  
  12.     TestAlgo algo;  
  13.     std::string strInput(strFileName);  
  14.     std::string strResult = algo.DoSomething(strFileName,arg0);  
  15.   
  16.     // 此处需要注意,由调用方开辟空间  
  17.     result = "中文测试!!";  
  18.     std::string strTemp = "输出字符串测试。。。";  
  19.     for(int i=0;i<500;i++)  
  20.     {  
  21.         strTemp += "多加一点数据...!!";  
  22.     }  
  23.       
  24.     if(NULL==g_csharp_string_callback)  
  25.         return NULL;  
  26.        
  27. // 把C++字符串传递给空的C#字符串  
  28.     *strOut =  g_csharp_string_callback(strTemp.c_str());  
  29.   
  30.     return result;  
  31. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值