• 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++接口示例

  • 相关阅读:
    苹果IPhone真机开发调试
    Unity3d 错误提示 GUI Error: You are pushing more GUIClips than you are popping. Make sure they are balanced
    Unity编辑器环境在Inspector面板中显示变量
    微信小程序开发
    Android 9.0 Http不能访问网络
    c#传不确定的参数个数,比如int型
    玩转@Git三剑客
    白话法律42讲-为程序员打造的专属法律武器
    uSurvival 1.41多人在线生存逃杀吃鸡类游戏源码
    NGUI: Next-Gen UI 2018.3.0f
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6469898.html
Copyright © 2020-2023  润新知