【问题标题】:C# - marshaling char ** in Equivalent data type in C#C# - 在 C# 中的等效数据类型中封送 char **
【发布时间】: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);

我遇到了类似的查询:

  1. How to get char** using C#? [duplicate]
  2. How do I marshal a pointer to an array of pointers to structures?

  3. marshaling char**

  4. C# equivalent to C const char**

尝试了所有方法,但没有奏效。返回空值。 有没有一种简单的方法来编组 Char ** ?

【问题讨论】:

  • 我们的主要应用程序也是C语言,我一直在用C#开发一个非常完整的模块。在审查了所有选项后,我们决定使用 C++/CLI 桥接器。过去几周我一直在构建它,我必须说,我真的很喜欢使用它。它确实击败了数据编组,因为您可以从 C 步到 C# 并返回调试器。这样,C# 代码就真正与 C 代码集成在一起了。数据转换是另一个很大的优势。您可以轻松处理任何数据类型,包括复杂的结构。如果您想了解更多信息,请告诉我。
  • 顺便说一句,如果您的主应用程序是 C#,那么桥接器也可以正常工作。事实上,这是 C++/CLI 更常见的用法。
  • 在 C# 中,数组派生自 System.Object。这意味着所有数组始终是在托管堆上分配的引用类型,并且您的应用程序的变量包含对数组的引用,而不是数组本身。
  • 它不是一个数组。调用者如何解除分配?
  • @Nik :实际上,我能够编组简单的数据类型,而不是双指针。

标签: c# c pointers marshalling dllimport


【解决方案1】:

您可以简单地将其编组为 IntPtr :

[DllImport("mylibrary.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int function_call(IntPtr val);

仅在函数调用端,将 mem 分配给指针并访问指针保存的数据:将非托管内存块中的数据编组为泛型类型参数指定的类型。

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多