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

原创 2012年06月18日 17:41:04


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库,Dll使用callback向C#传递指针

C++代码 void SetCallback(CPPCallback callback) { char *p = "from C++"; callback(p); } C#代码 [DllIm...
  • yuxikuo_1
  • yuxikuo_1
  • 2016年08月12日 01:48
  • 1144

C#调用返回C++指针的缓冲区,并释放

在C++的函数中new了一段内存char *test(char* filename) { new一段内存 } void release(char *mm); { delete一段内存...
  • beatbean
  • beatbean
  • 2012年12月30日 13:54
  • 309

C#调用C++DLL的小总结8---C++Dll中函数返回字符串指针

 C#调用C++DLL的小总结8---C++Dll中函数返回字符串指针 在这个系列的“C#调用C++DLL的小总结6---C++Dll中指针的释放问...
  • u011555996
  • u011555996
  • 2017年04月19日 11:16
  • 1738

c#调用C++写的DLL,传递二维指针参数

c++中函数声明如下: bool Test(float** arr,int rows,int cols); C#无法直接调用这种参数的函数,C#中你描述的那种二维数组,本质上跟一维数组...
  • CNHK1225
  • CNHK1225
  • 2016年11月10日 14:14
  • 1457

使用C++11解决内存泄漏的问题

C++语言中没有垃圾回收机制,必须自己去释放分配的堆内存,否则就会内存泄漏。相信大部分C++开发人员都遇到过内存泄漏的问题,而查找内存写了的问题往往要花大量的精力。 解决这个问题最有效的办法就是...
  • u013166575
  • u013166575
  • 2017年03月13日 15:58
  • 621

C++ 处理new分配内存失败

转自:http://www.51testing.com/html/70/n-827070.html在C++语言中,我们经常会使用new给一个对象分配内存空间,而当内存不够会出现内存不足的情况。C++提...
  • sailorlyq
  • sailorlyq
  • 2018年01月18日 22:11
  • 37

C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)

一:首先什么是IntPtr 先来看看MSDN上说的:用于表示指针或句柄的平台特定类型。这个其实说出了这样两个事实,IntPtr 可以用来表示指针或句柄、它是一个平台特定类型。对于它的解释,这个哥...
  • u010159842
  • u010159842
  • 2016年06月27日 10:49
  • 2623

Unity使用C#调用C++dll传递指针参数、接收指针返回值

C#调用C++返回指针参数 用IntPtr接收返回 下面是引入DLL的代码片段: [DllImport("BthExports")] public extern static IntPtr Bt...
  • ksgt00629518
  • ksgt00629518
  • 2016年12月06日 11:36
  • 1916

Go调用C代码,Cgo札记

http://www.myexception.cn/program/679738.html
  • newjueqi
  • newjueqi
  • 2014年06月18日 15:39
  • 9367

c++内存管理与指针的使用

导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无...
  • tiangwan2011
  • tiangwan2011
  • 2012年08月26日 16:41
  • 3934
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#调用C++dll 中具有高维指针参数的接口函数
举报原因:
原因补充:

(最多只允许输入30个字)