C#调用C++编写的dll文件

dll文件可以实现混合语言编程,这一点实用性很强。本文以一个初学者的身份把简单混用的例子记录一下(大佬勿喷),方便自己查看,也给其他在使用的过程中出现各种问题的小伙伴一个参考。
首先是C++编写dll文件,打开vs,文件>新建>项目,出现以下界面,选择红圈的部分,项目名称根据自己需要的改。最后单击确定。
在这里插入图片描述
接着点击下一步,出现下面的界面,选择红圈的选项,单击完成。在这里插入图片描述
接着在空项目里面分别新建一个.cpp和一个.h的文件。然后就可以开始写代码了。
本文就以实现加减乘除的算法来作为例子。在.h的头文件中的代码如下:

#pragma once
extern "C" _declspec(dllexport) int _stdcall myAdd(int input, int param);
extern "C" _declspec(dllexport) int _stdcall mySub(int input, int param);
extern "C" _declspec(dllexport) int _stdcall myMul(int input, int param);
extern "C" _declspec(dllexport) int _stdcall myDiv(int input, int param);

特别需要注意的地方:
extern “C”,_stdcall这些不可缺省,否则在C#调用的时候会出现“无法在dll中找到…(函数名)的入口”,如下图
在这里插入图片描述
具体的原因可以参考这篇博文:https://www.cnblogs.com/xiangtingshen/p/10980055.html
在.cpp的文件中直接把函数的实现写上就OK了。例如加减乘除:

#include "test.h"

int _stdcall myAdd(int input, int param) {
	return input + param;
}

int _stdcall mySub(int input, int param) {
	return input - param;
}

int _stdcall myMul(int input, int param) {
	return input * param;
}

int _stdcall myDiv(int input, int param) {
	return input / param;
}

最后生成解决方案,就可到工程目录找到dll文件了。这里需要注意的是:编译使用的是Debug还是Release,以及x64还是x86都要与C#使用的一样,否则也会报错。就是下图中红圈的部分要对应好。
在这里插入图片描述
下面就可以把dll文件拷贝到C#的工程目录中了,这里需要放在可执行文件的目录中,不是源码的那个目录。一般在bin\x64\Release中,如果你是x86和Debug,那么就对应找到该目录,把dll文件拷贝进去就可以了,如果没有找到bin的文件夹,那么可以先编译运行一次程序,就会出现bin目录。
下面是C#代码的实现了:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace ConsoleApplication2
{
    class Program
    {
        [DllImport("myAlgorithm.dll")]
        static extern int myDiv(int input, int param);
        static void Main(string[] args)
        {
            int a = 99;
            int b = 9;
            int c = myDiv(a, b);
            Console.WriteLine(c);
            Console.ReadLine();
        }
    }
}

代码中的using System.Runtime.InteropServices;这一句不可省略,正常新建的工程没有加上这一句。下面就是在程序的大类中声明需要用到dll库中的名字了,代码如下:

[DllImport("myAlgorithm.dll")]
static extern int myDiv(int input, int param);

最后可以尝试运行了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值