
C#与C++不同的地方在于,在C#中,资源的内存分配并不需要手动管理,new完后不需要delete,这虽然看起来方便了很多,但由于资源在内存中会被后台自己调动,所以有些时候我们用起来也要小心。这其中最坑我的就是用C#调用C++的dll。
C#的数组传给C++
对于C++来说,数组就是一个指向一组数据首地址的指针,这是一个简单朴素的数据结构,在C++中,这是一个很朴素的数据结构,以至于我们在传入数组时通常还要传入数组的长度,因为我们并不知道它有多长。C#中的数组比C++更完善,被封装成了一个类。虽然C#中使用起来方便了。但是却不能再直接传给C++,因此,我们需要做一些处理。
[DllImport("Test.dll")]
public static extern int test(
IntPtr a
);
double[] a;
fixed(double *a_ = a)
{
IntPtr aPtr = (IntPtr)a_;
text(aPtr);//调用C++写的dll
}
只有固定了数组,再获取指针才能让C++程序正确的使用C#的数组。注意,此代码只能在不安全模式下才可使用。
C#的bitmap传给C++
bitmap是C#中的一个图片数据类型,如果想要把图片传给C++,我们不需要把整个bitmap都传过去,只需传其中过的图片数据。与数组同理,我们也要先固定住它,才可以取其指针。
BitmapData bmpdata = null;
try
{
bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);//固定图片
IntPtr ptr = bmpdata.Scan0;//获取图像数据首地址
test(ptr);//调用C++
LunaMain luna = LunaMain.GetInstance();
luna.bestRegionPosX = x;
luna.bestRegionPosY = y;
}
finally
{
if (bmpdata != null)
bitmap.UnlockBits(bmpdata);//解锁图片
}




近期评论