C#调用C++ dll

记录下几个例子

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();
        }
    }
}

运行

 

 

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值