「C++学习笔记」动态链接库(Dll):C#调用C++的dll

    首先创建一个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”文件的路径关系!这里举例是写了绝对路径,实际开发中注意相对路径的拼接呦!

发布了21 篇原创文章 · 获赞 5 · 访问量 3670

猜你喜欢

转载自blog.csdn.net/Raink_LH/article/details/102677223