如何将 C# 字符串 [] 编组(理想情况下在 SWIG 中)到 C++ 字符串*?

Posted

技术标签:

【中文标题】如何将 C# 字符串 [] 编组(理想情况下在 SWIG 中)到 C++ 字符串*?【英文标题】:How do I marshall (in ideally in SWIG) a C# string[] to a C++ string*? 【发布时间】:2010-09-29 21:23:23 【问题描述】:

我是 C# 编程的新手,并试图调用 C++ 中的包装函数。

在 C++ 中我有以下原型的函数

string* swap(string* ptr1, string*ptr2)
    //swap the array of string
    return ptr2;

如何将此函数包装到 C# 中(最好使用 SWIG,但不是必需的)?

【问题讨论】:

该数组是如何终止的?不能传数组的大小吗? 什么是字符串类型?它是 std::string 还是其他一些结构/类或字符数组?能写的具体一点吗? 【参考方案1】:

我对 Java 也有同样的问题。

对于 Java,我没有找到任何预先打包且易于使用的东西。我必须定义自己的类型映射。

如果您没有得到更好的 C# 答案,您可以从 SWIG: How to wrap std::string& (std::string passed by reference) 中描述的 SWIG/C++ 代码开始。

您需要替换对 Java 类型、JNI 方法(包括对“jenv”的引用)和“JavaThrowException”的引用。

这些来自 SWIG 的文件还可能提供一些 C# 的相关示例代码:

swig/Lib/csharp/std_string.i swig/Lib/csharp/typemaps.i

【讨论】:

String 相对简单(?)但是我不知道 c# 中的 string[] 是如何在内存中构造的。它们只是带有 \0 终止符的连续缓冲区? 由于 C# 字符串是引用类型,我猜该数组是对非连续字符串对象的引用数组。我不知道在 C++ 中在 C# 和 C++ 字符串之间进行转换的最简单方法。

以上是关于如何将 C# 字符串 [] 编组(理想情况下在 SWIG 中)到 C++ 字符串*?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中编组 wstring *?

通过 P/Invoke 将 MFC CArray 编组为 C#

编组包含 c 字符串的结构

将字符串从 c# 编组到 c++

C#编组来自C++ DLL的无符号字符返回值[重复]

C# 将 char* 编组到 StringBuilder 总是得到空字符串