C# c中的int**和c中的int[][]是相同的吗?

C# c中的int**和c中的int[][]是相同的吗?,c#,c,C#,C,我有一个用C编写的DLL文件。我正在尝试在我的C代码中使用C DLL。C程序方法返回int**。c中的int**和c中的int[][]是相同的吗 从c程序返回值时出错 c方法 __declspec(dllexport) int someMethod ( size_t *foo, int **bar ) { *foo = 10; **bar = 10; } 我的c代码 C的int**和C的i

我有一个用C编写的DLL文件。我正在尝试在我的C代码中使用C DLL。C程序方法返回int**。c中的int**和c中的int[][]是相同的吗

从c程序返回值时出错

c方法

__declspec(dllexport) int someMethod
    (
        size_t *foo, 
        int **bar
    ) 
    { 
        *foo = 10; 
        **bar = 10; 
    }
我的c代码


C的
int**
和C的
int[][]
在概念上相似,但在二进制级别不同:

  • int**
    是指向非托管堆内存中原始数据的指针
  • int[][]
    是对托管阵列的托管引用的托管引用;每个指向数组的头(包含其长度),而不是其原始数据
我不知道为C#封送什么最容易。
SAFEARRAY
可以嵌套吗?如果是这样,它可能很容易映射到C#数组


确定有效的解决方案是使用C++/CLI DLL作为两个代码之间的粘合剂,在返回C#之前将
int**
转换为
CLI::array^
(其中涉及复制指向的数据)。

假设C函数原型是正确的,我认为您应该在C#端声明它:


然而,我担心内存泄漏。我不确定如何释放非托管阵列。

能否向我们展示一些代码?您遇到了什么错误?
**
是指向指针的指针<代码>[]]是一个数组数组,或者换句话说
是锯齿状的
。我有一种感觉,这并不意味着同一件事:)一个简单的控制台应用程序。使用DLLImport语句将有帮助您的问题的简单答案是“否”。因为您没有告诉我们您试图解决的问题,我们只能提供更多帮助。int**变量的C#等价物是不安全的{int**variable;}“但在二进制级别不同”-怎么会这样?@SecurityMatt我刚刚添加了info.System.Runtime.InteropServices.MarshalDirectiveException:无法封送'parameter#2':无法对ByRef数组参数使用SizeParamIndex。我收到这个错误。这一定意味着标准封送器不能将marchal数组作为输出参数。
[DllImport(@"my.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true, BestFitMapping = true, EntryPoint = "someMethod")]
    public unsafe static extern int someMethod
    (
        out Int16 foo, 
        [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(JaggedArrayMarshaler))] 
        out int[][] bar
    );
public unsafe static extern int someMethod
(
    out Int16 foo, 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0, ArraySubType=UnmanagedType.I2)] 
    out int[] bar
);