【发布时间】:2017-10-13 22:36:16
【问题描述】:
我正在开发使用基于 C 的库的 C#.Net 应用程序。由于它需要 C# Wrapper,我正在实现代码以编组基于 C 的库中的函数,以便在 C# 中访问并正确映射数据类型。
我在库中有一个函数,它通过引用获取一个 char 数组,该函数包含用其中的值更新数组的逻辑。因此,在函数调用时,我们可以传递空数组并在调用后访问结果值。
目的:传递空字符数组并通过引用返回值
C-dll 函数:
int function_call(char ** var);
C函数调用代码:
char *name = NULL;
int val = function_Call(&name);
C# 封装代码:
[DllImport("mylibrary.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int function_call([In] string[] val);
C#函数调用代码:
string[] name = null;
int ret = function_call(name);
我遇到了类似的查询:
- How to get char** using C#? [duplicate]
How do I marshal a pointer to an array of pointers to structures?
尝试了所有方法,但没有奏效。返回空值。 有没有一种简单的方法来编组 Char ** ?
【问题讨论】:
-
我们的主要应用程序也是C语言,我一直在用C#开发一个非常完整的模块。在审查了所有选项后,我们决定使用 C++/CLI 桥接器。过去几周我一直在构建它,我必须说,我真的很喜欢使用它。它确实击败了数据编组,因为您可以从 C 步到 C# 并返回调试器。这样,C# 代码就真正与 C 代码集成在一起了。数据转换是另一个很大的优势。您可以轻松处理任何数据类型,包括复杂的结构。如果您想了解更多信息,请告诉我。
-
顺便说一句,如果您的主应用程序是 C#,那么桥接器也可以正常工作。事实上,这是 C++/CLI 更常见的用法。
-
在 C# 中,数组派生自 System.Object。这意味着所有数组始终是在托管堆上分配的引用类型,并且您的应用程序的变量包含对数组的引用,而不是数组本身。
-
它不是一个数组。调用者如何解除分配?
-
@Nik :实际上,我能够编组简单的数据类型,而不是双指针。
标签: c# c pointers marshalling dllimport