关键词搜索

源码搜索 ×
×

c++动态库打包为dll文件供C#项目调用

发布2018-09-27浏览1863次

详情内容

C++与C#接口交互需要通过DLL库来完成。

编写C++动态库

创建项目:

添加C++测试类:

在MathAPI.h定义接口方法:

  1. #pragma once
  2. class MathAPI
  3. {
  4. public:
  5. MathAPI();
  6. ~MathAPI();
  7. static _declspec(dllexport) double Add(double a, double b);
  8. static _declspec(dllexport) double Subtract(double a, double b);
  9. static _declspec(dllexport) double Multiply(double a, double b);
  10. static _declspec(dllexport) double Devide(double a, double b);
  11. };

在MathAPI.cpp实现接口方法:

  1. #include "pch.h"
  2. #include "MathAPI.h"
  3. #include "stdexcept"
  4. MathAPI::MathAPI()
  5. {
  6. }
  7. MathAPI::~MathAPI()
  8. {
  9. }
  10. double MathAPI::Add(double a, double b)
  11. {
  12. return a + b;
  13. }
  14. double MathAPI::Subtract(double a, double b)
  15. {
  16. return a - b;
  17. }
  18. double MathAPI::Multiply(double a, double b)
  19. {
  20. return a * b;
  21. }
  22. double MathAPI::Devide(double a, double b)
  23. {
  24. if (b == 0)
  25. {
  26. throw new _exception;
  27. }
  28. return a / b;
  29. }

修改项目的属性,输出为动态库dll:

然后生成即可。

C#调用dll库

利用vs提供的dumpbin.exe工具可以查看dll的入口,在vs安装目录搜索即可找到。

dumpbin的选项指令:

为了快速看到效果,直接将FFmpegDXVA2dll.dll文件复制到dumpbin.exe所在的目录执行以下命令 :

上面输出中?Add@MathAPI@@SANNN@Z 表示ADD函数的入口,我们在C#程序中使用时需要设置这个入口。

创建一个C#控制台程序,并将我们需要的dll库放入其中:

C#中定义dll接口访问:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace DllImportTest
  8. {
  9. public class Math
  10. {
  11. [DllImport("FFmpegDXVA2dll.dll", EntryPoint = "?Add@MathAPI@@SANNN@Z", CallingConvention = CallingConvention.Cdecl)]
  12. public static extern double Add(double a, double b);
  13. [DllImport("FFmpegDXVA2dll.dll", EntryPoint = "?Subtract@MathAPI@@SANNN@Z", CallingConvention = CallingConvention.Cdecl)]
  14. public static extern double Subtract(double a, double b);
  15. [DllImport("FFmpegDXVA2dll.dll", EntryPoint = "?Multiply@MathAPI@@SANNN@Z", CallingConvention = CallingConvention.Cdecl)]
  16. public static extern double Multiply(double a, double b);
  17. [DllImport("FFmpegDXVA2dll.dll", EntryPoint = "?Devide@MathAPI@@SANNN@Z", CallingConvention = CallingConvention.Cdecl)]
  18. public static extern double Devide(double a, double b);
  19. }
  20. }

Program运行:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace DllImportTest
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. double a = 20, b = 5;
  13. Console.WriteLine(Math.Add(a,b));
  14. Console.WriteLine(Math.Subtract(a, b));
  15. Console.WriteLine(Math.Multiply(a, b));
  16. Console.WriteLine(Math.Devide(a, b));
  17. Console.Read();
  18. }
  19. }
  20. }

输出结果:

至此,C#已经成功实现调用C++ 动态dll库的功能了。

参考文章:

https://blog.csdn.net/nini_boom/article/details/78084408

https://blog.csdn.net/dearkundy/article/details/73331514

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载