将C ++ dll导出到c#

'using System; 'using System.Collections.Generic; 'using System.Drawing; 'using System.Windows.Forms; 'using Emgu.CV; 'using Emgu.CV.Structure; 'using Emgu.CV.CvEnum; 'using System.IO; 'using System.Diagnostics; 'using System.Runtime.InteropServices; 'namespace FaceStat '{ 'class Form1 : Form { // public static extern void AsmSearchDll(out int nlmarks, out int lmarks, string imgname, byte imgdata, int width, int height, int is_color, string conf_file0, string conf_file1); [DllImport(@"../data/stasm_dll.dll")] public static extern void AsmSearchDll( out int pnlandmarks, // out: number of landmarks, 0 if can't get landmark out int[] landmarks, // out: the landmarks, caller must allocate [MarshalAs(UnmanagedType.LPStr)]string image_name, // in: used in internal error messages, if necessary [MarshalAs(UnmanagedType.LPStr)]string image_data, // in: image data, 3 bytes per pixel if is_color int width, // in: the width of the image int height, // in: the height of the image int is_color, // in: 1 if RGB image, 0 if grayscale [MarshalAs(UnmanagedType.LPStr)]string conf_file0, // in: 1st config filename, NULL for default [MarshalAs(UnmanagedType.LPStr)]string conf_file1 // in: 2nd config filename, NULL for default, "" for none ); static void Main(string[] args) { string image_name = "../data/Chupul.jpg"; IplImage img = cvlib.cvLoadImage(image_name, cvlib.CV_LOAD_IMAGE_COLOR); if (img == null) { Console.Write("Error: Can't open the image. {0}\n", image_name); return; } int nlandmarks; int[] landmarks = new int[500]; // space for x,y coords of up to 250 landmarks AsmSearchDll(out nlandmarks, out landmarks, image_name, img.imageData, img.width, img.height, 1, null, null); if (nlandmarks == 0) { Console.Write("\nError: Cannot locate landmmarks in {0}\n", image_name); return; } int[] p = landmarks; cvlib.cvPolyLine(img, p, nlandmarks, 1, true, cvlib.CV_RGB(255,0,0)); cvlib.cvShowImage("Asm example", img); cvlib.cvWaitKey(0); cvlib.cvDestroyWindow("Asm example"); cvlib.cvReleaseImage(img); return; } } '} 

我有6个错误

  1. ‘FaceStat.Form1.AsmSearchDll(out int,out int [],string,string,int,int,int,string,string)’的最佳重载方法匹配’有一些无效的参数

  2. 参数4无法从’System.IntPtr’转换为’string’

  3. ‘cvlib.cvPolyLine(CvArr,CvPoint [],int [],int,int,CvScalar)的最佳重载方法匹配’有一些无效的参数

  4. 参数2无法从’int []’转换为’CvPoint []’

  5. 参数3无法从’int’转换为’int []’

  6. 参数5:无法从’bool’转换为’int’

谢谢

C ++ DLL

 void AsmSearchDll ( int *pnlandmarks, // out: number of landmarks, 0 if can't get landmarks int landmarks[], // out: the landmarks, caller must allocate const char image_name[], // in: used in internal error messages, if necessary const char image_data[], // in: image data, 3 bytes per pixel if is_color const int width, // in: the width of the image const int height, // in: the height of the image const int is_color, // in: 1 if RGB image, 0 if grayscale const char conf_file0[], // in: 1st config filename, NULL for default const char conf_file1[] // in: 2nd config filename, NULL for default, "" if none ) 

 [DllImport(@"../data/stasm_dll.dll")] internal static extern void AsmSearchDll ( [Out] out Int32 pnlandmarks, [Out] out Int32[] landmarks, [In, MarshalAs(UnmanagedType.LPStr)] String image_name, [In, MarshalAs(UnmanagedType.LPStr)] String image_data, [In] Int32 width, [In] Int32 height, [In] Int32 is_color, [In, MarshalAs(UnmanagedType.LPStr)] String conf_file0, [In, MarshalAs(UnmanagedType.LPStr)] String conf_file1 ); IplImage img = cvlib.cvLoadImage(image_name, cvlib.CV_LOAD_IMAGE_COLOR); String imageData = Marshal.PtrToStringAnsi(img.imageData); AsmSearchDll(out nlandmarks, out landmarks, image_name, imageData, img.width, img.height, 1, null, null); 

你没有指定cvPolyLine …所以我无法检查参数。 无论如何……你只是将错误的值类型传递给你的方法。 就这么简单。