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

如何在 C# 和 C DLL 之间无缝传递字符串?

Susan Sarandon
Susan Sarandon原创
2025-01-03 19:35:41332浏览

How to Seamlessly Pass Strings Between C# and C   DLLs?

将字符串从 C# 传递到 C DLL 并返回

当尝试在 C# 和 C 之间传递字符串时,开发人员经常会遇到困难。在本文中,我们深入研究这个问题并提供一个简洁的解决方案。

问题

考虑以下代码,其中 C 定义了一个连接字符串的函数:

extern "C" {
    string concat(string a, string b){
        return a + b;
    }
}

在 C# 中,该函数调用使用interop:

[DllImport("*****.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern string concat(string a, string b);

但是,这种方法会导致 System.AccessViolationException。

解决方案

问题在于 C 的不兼容std::string 具有互操作性边界。要解决此问题,必须在边界处使用互操作友好的类型,例如以 null 结尾的字符数组。

将字符串从 C# 传递到 C

For字符串从 C# 传递到 C ,可以修改 C 函数:

void foo(const char *str)
{
    // do something with str
}

并且在C#:

[DllImport("...", CallingConvention = CallingConvention.Cdecl)
static extern void foo(string str);

将字符串从 C 传递到 C#

对于从 C 传递到 C# 的字符串,C 函数变为:

void foo(char *str, int len)
{
    // write no more than len characters into str
}

在 C# 中:

[DllImport("...", CallingConvention = CallingConvention.Cdecl)
static extern void foo(StringBuilder str, int len);

通过遵守这些准则,开发人员可以在 C# 和 C DLL 之间无缝传递字符串。

以上是如何在 C# 和 C DLL 之间无缝传递字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

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