我正在尝试从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#中重用它
这个怎么样(注意,它假设正确的长度 - 您应该传入缓冲区长度并防止溢出等):
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。
最近,我也遇到了这个问题,尽管我为您提供了解决方案,但遗憾的是我无法真正解释它。我还没有找到合理的解释。
我的用于检索字符串的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)