将字符串从 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中文网其他相关文章!