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

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

Susan Sarandon
发布: 2025-01-03 19:35:41
原创
308 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板