c#引用c++的dll

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);//解锁图片
}