记录下几个例子
C++ 新建一个项目,动态链接库,源文件新建一个类dll1.cpp 写入以下代码
#include "pch.h"
#include<math.h>
extern"C" __declspec(dllexport)int Add(int x,int y)
{
return x+y;
}
extern"C" __declspec(dllexport)void Pow(int*x, double y)
{
*x = pow(*x, y);
}
运行,得到Dll1.dll
C# 新建一个控制台项目,调用过程
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
namespace ConsoleApp5
{
class CPPDLL
{
[DllImport("Dll1.dll", EntryPoint = "Add", CallingConvention = CallingConvention.Cdecl)]
public static extern int Add(int a, int b);
[DllImport("Dll1.dll", EntryPoint = "Pow", CallingConvention = CallingConvention.Cdecl)]
public static extern void Pow(ref int x, double y);
}
class Program
{
static void Main(string[] args)
{
int res = CPPDLL.Add(3, 5);
int x = 3;
CPPDLL.Pow(ref x, 2);
Console.WriteLine(res);
Console.WriteLine(x);
Console.ReadLine();
}
}
}
研究了下OpenCV,在C++中可以用OpenCV打开一张图片
C++新建一个控制台项目,使用opencv打开图片没问题。
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
std::cout << "Hello World!\n";
Mat srcImage = imread("d:\\1.jpg");
imshow("aa", srcImage);
waitKey(0);
}
测试下把它变成dll,给C#调用
看到有两种方式,托管和非托管方式
1.非托管方式
C++ 新建一个动态链接库,源文件添加dll2.cpp
#include "pch.h"
#include<opencv2/opencv.hpp>
using namespace cv;
extern"C" __declspec(dllexport)void Show()
{
Mat srcImage = imread("d:\\1.jpg");
imshow("aa", srcImage);
waitKey(0);
return;
}
运,得到Dll2.dll
在C#中使用,C#新建一个控制台程序,将Dll2.dll拷贝至可执行文件目录下,调用方式如下图。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
namespace ConsoleApp6
{
class CPPDLL
{
[DllImport("Dll2.dll", CharSet = CharSet.Ansi)]
public static extern int Show();
}
class Program
{
static void Main(string[] args)
{
CPPDLL.Show();
Console.ReadLine();
}
}
}
运行
2.托管方式
C++ 新建一个动态链接库 源文件新建Functions.cpp
#include "pch.h"
#include<opencv2/opencv.hpp>
using namespace cv;
void show()
{
Mat img = imread("d:\\1.jpg");
imshow("src", img);
waitKey(0);
}
头文件 Functions.h
#pragma once
void show();
头文件clrClass.h
#pragma once
public ref class clrClass
{
public:
clrClass(void);
~clrClass(void);
int member;
void showImage();
};
源文件 clrClass.cpp
#include "pch.h"
#include "clrClass.h"
#include "Functions.h"
clrClass::clrClass(void)
{
}
clrClass::~clrClass(void)
{
}
void clrClass::showImage()
{
show();
}
Dll3属性,公共语言运行时支持
运行,得到Dll3.dll
在C#中调用
新建一个控制台项目,引用刚才生成的Dll3.dll
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApp7
{
class Program
{
static void Main(string[] args)
{
clrClass ClrClass = new clrClass();
ClrClass.showImage();
}
}
}
运行