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

作者:朱金灿

来源: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++接口示例

posted on 2016-04-12 19:26  岚之山  阅读(6061)  评论(0编辑  收藏  举报

导航