首页 >后端开发 >C++ >如何在 C# 和 C DLL 之间高效地传递字符串?

如何在 C# 和 C DLL 之间高效地传递字符串?

Patricia Arquette
Patricia Arquette原创
2025-01-01 01:19:091065浏览

How to Efficiently Pass Strings Between C# and a C   DLL?

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn