C#调用C++dll 中具有高维指针参数的接口函数


C#调用C++dll 中具有高维指针参数的接口函数

首先需要说明的是,这里的指针指向的都是基本类型,或基本类型的指针。

如果接口函数中有一维指针做参数,那么可以在C#中对应的声明中添加关键字ref。

如果是高维指针,那么上述方法就不行了。可采用如下两种做法。

做法一:如果高维指针指向的内存地址连续,考虑将指针转换为数组传递。C++中的多维数组与C#中的多维数组均是结构一致的连续内存块。因此只要两边数组各维大小均相同的情况下,可以直接传递。该方法操作简单,可以首先考虑。

C++代码:

extern "C" __declspec(dllexport) void fun(int a[][]);

C#代码:

public static extern void fun(int[,] a)



做法二:使用非安全代码。

C++代码:

extern "C" __declspec(dllexport) void fun(int** a);

C#代码:

public static extern unsafe void fun(int** a);


C#中比须在非安全代码中才能使用指针,因此为了调用上述函数,还需要定义一个包含unsafe代码段的函数。该方法的优点是较灵活,在处理多维数组的同时还可以处理交叉数组,和多个一维数组。

void callfun(int [,] a)
{
	unsafe
	{
		fixed(int* pa=a)
		{
			int*[] pointersarray_a=new int[a.GetUpperBound(0)+1];
			for(int i=0;i<a.GetUpperBound(0)+1;i++)
			{
				pointersarray_a[i]=pa+i*(a.GetUpperBound(1)+1);
			}
			fixed(int** pointerspointers_a=pointersarray_a)
			{
				fun(pointerspointers_a);
			}
		}
	}
}





阅读更多
文章标签: c# c++ dll fun c
想对作者说点什么? 我来说一句

c#调用C++DLL实例

2010年03月17日 896KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭