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);
最后可以尝试运行了。