从 c# 调用的 c dll 导出函数返回字符串

新手上路,请多包涵

我正在尝试从 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;
}

当我尝试从 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);
}

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

已编辑————

有没有类似的东西,我可以将一个空缓冲区从 c# 传递给 c++,而 c++ 函数将填充数据,我可以在 C# 中重用它

原文由 Rawat 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

 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());
}

然后在 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));
}

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

原文由 user3690202 发布,翻译遵循 CC BY-SA 3.0 许可协议

最近我也遇到了这个问题,虽然我有一个解决方案给你,但遗憾的是我无法真正解释它。我还没有找到合理的解释。

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

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

和我的 C# 代码:

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

如您所见,您可以提供一个字符串(通过使用 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;
}

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

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

    __GetValue__(str, STRING_MAX_LENGTH);

    return str.ToString();
}

原文由 Bas in het Veld 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题