Return string from c++ dll export function called from c#

前端 未结 4 2025
灰色年华
灰色年华 2021-02-09 16:37

I am trying to return a string from a c++ dll export function. I am calling this function from c#. I have seen a lot of examples on the internet and I am really confused what to

4条回答
  •  面向向阳花
    2021-02-09 17:25

    I have had this problem too, recently, and though I have a solution for you, sadly I can't really explain it. I haven't found a sound explanation yet.

    my c++ code for retrieving a string is:

    extern "C" { __declspec(dllexport) void __GetValue__(char* str, int strlen); }
    

    and my C# code:

    [DllImport("MyDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern void __GetValue__(StringBuilder str, int strlen);
    

    So as you can see, instead of returning a value, you can supply a string (by using StringBuilder) and let C++ fill in the data like:

    void __GetValue__(char* str, int strlen) {
        std::string result = "Result";
    
        result = result.substr(0, strlen);
    
        std::copy(result.begin(), result.end(), str);
        str[std::min(strlen-1, (int)result.size())] = 0;
    }
    

    And for completeness the C# code to request the string:

    public String GetValue() {
        StringBuilder str = new StringBuilder(STRING_MAX_LENGTH);
    
        __GetValue__(str, STRING_MAX_LENGTH);
    
        return str.ToString();
    }
    

提交回复
热议问题