最近做項目,需要將C++算法封裝成dll,給C#調用,之前沒接觸過C#,現學一波,只做了dll並用C#測試了下,運行成功。記錄下來過程,供大家參考。
編程環境:VS2013+opencv2.4.13
步驟:
1.創建C++項目,製作dll.
(1)打開vs,新建->項目->win32控制檯項目
(2)選擇dll,點擊完成
(3)生成了c++項目。默認包含幾個cpp和h文件。
(4)打開Win32Project1.cpp文件,編寫如下函數。OpenCV中包含目錄、庫目錄、鏈接器附加依賴項配置這裏不再詳述。
代碼如下:
#include "stdafx.h"
#include "Win32Project2.h"
#include <iostream>
#include <string>
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace cv;
char* _stdcall show(char* name)
{
Mat img = imread(name);
if (img.empty())
{
return "can not open";
}
else
{
imshow("test", img);
waitKey(0);
return "open!";
}
}
(5)右鍵頭文件文件夾-添加-新建項,創建Win32Project1.h文件
代碼:
#pragma once
#include <iostream>
extern "C" _declspec(dllexport) char * _stdcall show(char* name);
(6)之後就可以生成解決方案了,注意這裏選擇的“Debug”模式,平臺是“Win32”。生成後的dll和lib文件在C#項目對應文件夾的debug文件夾下(先建立c#項目,一會附圖添加dll和lib)
2.創建c#項目
(1)打開vs,如下設置,
(2)創建好了之後,需要將第一步生成的dll放到該c#文件夾下,例如c#中我選擇的是“debug”模式,注意平臺也對應Win32,如下,將dll放到了文件夾下。
(3)在c#的cs文件中調用dll,在C#中Program.cs填寫如下代碼
代碼:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace c.demo2
{
class Program
{
[DllImport(@"Win32Project1.dll", EntryPoint = "show", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
extern static IntPtr show([MarshalAs(UnmanagedType.LPStr)]string name);
static void Main(string[] args)
{
IntPtr name = show("D:\\1.jpg");//圖片路徑
string check = Marshal.PtrToStringAnsi(name);
Console.WriteLine(check);
Console.ReadKey();
}
}
}