Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于数组的Dll互操作和内存管理_C#_.net_Interop_Marshalling - Fatal编程技术网

C# 关于数组的Dll互操作和内存管理

C# 关于数组的Dll互操作和内存管理,c#,.net,interop,marshalling,C#,.net,Interop,Marshalling,我的问题是关于在.Net中互操作DLL时的内存使用情况(我使用的是C#,但答案应该适用于其他.Net语言) 假设我在dll中有一个C函数,它接受一个数组: extern __declspec(dllexport) void Func(int * arr, int len); 我可以在C#中选择两个相应的调用: 或: 如果C函数未解除分配阵列,则后一种互操作方法是否会通过假定C函数将释放封送阵列而导致内存泄漏,或者互操作系统是否知道要释放封送阵列?使用第二个选项时不会发生泄漏。封送拆收器只是固定

我的问题是关于在.Net中互操作DLL时的内存使用情况(我使用的是C#,但答案应该适用于其他.Net语言)

假设我在dll中有一个C函数,它接受一个数组:

extern __declspec(dllexport) void Func(int * arr, int len);
我可以在C#中选择两个相应的调用:

或:


如果C函数未解除分配阵列,则后一种互操作方法是否会通过假定C函数将释放封送阵列而导致内存泄漏,或者互操作系统是否知道要释放封送阵列?

使用第二个选项时不会发生泄漏。封送拆收器只是固定数组,并将固定对象的地址传递给非托管函数。当非托管函数返回时,数组被取消固定

钉扎是针对可空袭类型阵列的优化。如果您传递一个不可blittable类型的数组,封送拆收器将负责所有内存生存期

[DllImport("Lib.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void Func([In] IntPtr arr, [In] int len);
[DllImport("Lib.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void Func([In] int[] arr, [In] int len);