要在C中返回数组,需要使用指针。为了澄清我的问题,我创建了一个简单的.c函数,并编译成DLL,并通过C#访问它。C函数如下:
#include <stdio.h>
__declspec(dllexport) int* ReturnArray(int size) {
int* arr = malloc(size * sizeof(int));
arr[0] = 19;
arr[1] = 18;
arr[2] = 17;
arr[3] = 16;
arr[4] = 15;
return arr;
}
在C#端:
namespace ConsoleC2CSExample
{
class Program
{
[DllImport("array.dll", EntryPoint = "ReturnArray", CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern short* ReturnArray(int size);
static unsafe void Main(string[] args)
{
int arraySize = 5;
short *ptr = ReturnArray(arraySize);
for(int i = 0; i < arraySize; i++)
Console.WriteLine(*(ptr + i * sizeof(short)));
Console.Read();
}
}
}
输出结果如下所示:
我有两个问题。
- 不使用unsafe模式,如何完成此操作?
- 如果使用unsafe,会有什么危险?
public static extern int[] ReturnArray(int size);
(或者根据字宽度而定为public static extern short[] ReturnArray(int size);
),会发生什么? - Mathias R. Jessenmalloc
(或new
)分配的内存从c
dll传递到c#
,并期望其生命周期得到管理 - 内存由dll本地的内存管理器跟踪,而CLR不知道如何管理或释放它。 - 500 - Internal Server Error