C# c中的int**和c中的int[][]是相同的吗?
我有一个用C编写的DLL文件。我正在尝试在我的C代码中使用C DLL。C程序方法返回int**。c中的int**和c中的int[][]是相同的吗 从c程序返回值时出错 c方法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
__declspec(dllexport) int someMethod
(
size_t *foo,
int **bar
)
{
*foo = 10;
**bar = 10;
}
我的c代码
C的
int**
和C的int[][]
在概念上相似,但在二进制级别不同:
是指向非托管堆内存中原始数据的指针int**
是对托管阵列的托管引用的托管引用;每个指向数组的头(包含其长度),而不是其原始数据李>int[][]
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
);