首先创建一个C++的dll,具体步骤,请参考我的:「C++学习笔记」动态链接库(Dll):创建与调试。
1、创建C#控制台项目
就在dll的目录下直接创建吧,添加一个名称为“CSharpUseDll”的C#控制台程序。
创建完成后,在 【解决方案平台】处下拉点击【配置管理器】
在【配置管理器】中,把该项目的平台选择为“X64”(与dll对应)。
如果没有“X64”平台,则新建即可,新建时,不要勾选“创建新的解决方案平台”(因为我这里其他项目已经有X64平台了,如果你是在其他目录,单独新建的C#项目,即解决方案下只有这个项目,就需要勾选!!!)
2、 编码调用
C#调用C++的dll,其方法与C++自己动态调用是类似的。
在C#中,我们需要使用“DllImport()”方法。
代码如下:
using System;
//需要Runtime.InteropServices命名空间
using System.Runtime.InteropServices;
namespace CSharpUseDll
{
class Program
{
//在xxx.dll中,找EntryPoint对应的函数,并对应到extern后的C#函数上。
[DllImport(@"D:\code\CppDllDemo\x64\Debug\CppDllDemo.dll", EntryPoint = "Add", CallingConvention = CallingConvention.StdCall)]
public static extern double Add(double a, double b);//可以重新命名函数,例如AddFunc(double a, double b)
[DllImport(@"D:\code\CppDllDemo\x64\Debug\CppDllDemo.dll", EntryPoint = "SayHello", CallingConvention = CallingConvention.StdCall)]
public static extern double SayHello();
static void Main(string[] args)
{
double res = Add(4.5, 11.2);
Console.WriteLine("{0}", res);
SayHello();
Console.ReadKey();
}
}
}
详细的请看代码中的注释
这里补充一点:
CallingConvention = CallingConvention.StdCall 是指定函数的调用方式,StdCall是调用非托管的代码的默认方式,所以可以省略,C++创建的dll中,也没有明确指示,所以就是默认的了,如果需要,可以在创建dll时进行指定,例如:
//在C++创建的dll中, xxxDll.h文件下
//要外部调用的函数可以声明调用方式
CPPDLLDEMO_API double __stdcall Add(double a, double b);
CPPDLLDEMO_API void WINAPI SayHello();
//C++内部 : #define WINAPI __stdcall 即这两个是等价的。
以上,运行C#控制台项目后,即
尾巴:别忘了
一样的,最终生成的C# exe程序与你调用的“dll”文件的路径关系!这里举例是写了绝对路径,实际开发中注意相对路径的拼接呦!