从C#调用的C ++ DLL导出函数返回字符串

Raw*_*wat 4 c# c++ windows-ce

我正在尝试从C ++ dll导出函数返回一个字符串。我从c#调用此函数。我在互联网上看到了很多例子,我真的很困惑该怎么办。

我的C ++代码导出功能:

extern "C" __declspec(dllexport)  char*  __cdecl getDataFromTable(char* tableName)
{
    std::string st = getDataTableWise(statementObject, columnIndex);
    printf(st.c_str()); 

    char *cstr = new char[st.length() + 1];
    strcpy(cstr, st.c_str());
    return cstr;
} 
Run Code Online (Sandbox Code Playgroud)

当我尝试从c#调用此函数时:

[DllImport("\\SD Card\\ISAPI1.dll")]
private static extern string getDataFromTable(byte[] tablename);
static void Main(string[] args)
{
    string str = getDataFromTable(byteArray);
    Console.writeLine(str);
}
Run Code Online (Sandbox Code Playgroud)

调用时出现错误。我正在为WinCE 6.0创建它

编辑------------------------

是否有类似的东西,我可以将空缓冲区从c#传递到c ++,并且c ++函数将填充数据,并且可以在C#中重用它

use*_*202 6

这个怎么样(注意,它假设正确的长度 - 您应该传入缓冲区长度并防止溢出等):

extern "C" __declspec(dllexport)  void  __cdecl getDataFromTable(char* tableName, char* buf)
{
    std::string st = getDataTableWise(statementObject, columnIndex);
    printf(st.c_str()); 

    strcpy(buf, st.c_str());
} 
Run Code Online (Sandbox Code Playgroud)

然后在 C# 中:

[DllImport("\\SD Card\\ISAPI1.dll")]
private static extern string getDataFromTable(byte[] tablename, byte[] buf);
static void Main(string[] args)
{
    byte[] buf = new byte[300];
    getDataFromTable(byteArray, buf);
    Console.writeLine(System.Text.Encoding.ASCII.GetString(buf));
}
Run Code Online (Sandbox Code Playgroud)

请注意,这确实对 C++ 应用程序中的字符编码不是 unicode 做出了一些假设。如果它们是 unicode,请使用 UTF16 而不是 ASCII。

  • 不应该`private static extern string getDataFromTable` 是`private static extern void getDataFromTable` 吗? (4认同)

Bas*_*eld 5

最近,我也遇到了这个问题,尽管我为您提供了解决方案,但遗憾的是我无法真正解释它。我还没有找到合理的解释。

我的用于检索字符串的c ++代码是:

extern "C" { __declspec(dllexport) void __GetValue__(char* str, int strlen); }
Run Code Online (Sandbox Code Playgroud)

和我的C#代码:

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

如您所见,您可以提供一个字符串(通过使用StringBuilder)而不是返回值,并让C ++像以下那样填充数据:

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;
}
Run Code Online (Sandbox Code Playgroud)

为了完整起见,C#代码请求字符串:

public String GetValue() {
    StringBuilder str = new StringBuilder(STRING_MAX_LENGTH);

    __GetValue__(str, STRING_MAX_LENGTH);

    return str.ToString();
}
Run Code Online (Sandbox Code Playgroud)