在 C# 和 C DLL 之间传递字符串:一个最小示例
在此查询中,开发人员努力在 C# 和 C 之间传递字符串DLL。对他们的代码的分析揭示了阻碍他们努力的一个基本问题:C std::string 和 C# 字符串在互操作边界处不兼容。
他们定义的 C DLL 函数:
extern "C" { string concat(string a, string b){ return a + b; } }
无法从 C# 直接访问。这是因为 std::string 不是互操作友好的数据类型,不应跨越互操作边界传递。
要解决此问题,开发人员必须使用替代的互操作友好数据类型。一种常见的方法是利用以 null 结尾的字符数组,因为这些可以在不同的编程语言之间轻松编组。这是他们的 C 代码的修改版本:
extern "C" { void concat(char* str1, char* str2, char** result) { int len1 = strlen(str1); int len2 = strlen(str2); int resultSize = len1 + len2 + 1; //null-terminator included *result = (char*)malloc(resultSize); //allocate memory for the result string strcpy(*result, str1); strcat(*result, str2); //append str2 to str1 } }
该函数采用三个参数:两个输入字符数组(str1 和 str2)和一个结果字符数组(*result),该数组将被分配并返回到
在 C# 中,可以相应调整代码:
[DllImport("*****.dll", CallingConvention = CallingConvention.Cdecl)] static extern void concat(string str1, string str2, StringBuilder result); ... StringBuilder result = new StringBuilder(10); concat("a", "b", result); Console.WriteLine(result.ToString());
此代码分配一个 StringBuilder容量为 10 个字符,并将其作为结果参数传递给 C 函数。函数执行后,连接的字符串将在 StringBuilder 中可用。
通过利用这种方法,开发人员确保使用互操作兼容的数据类型传递和返回字符串,从而解决了之前发生的 System.AccessViolationException .
以上是如何在 C# 和 C DLL 之间高效地传递字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!