一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

闲暇之余,记一下笔记!记录一下c#如何调用C++的动态库(dll).

步骤:

一、创建一个C++类,例如:

AddOperate.h

1 extern _declspec(dllexport) int Sum(int a, int b);
2 class AddOperate
3 {
4 public :
5 };

AddOperate.cpp

复制代码
 1 #include "AddOperate.h"
 2 #include "iostream"
 3 using namespace std;
 4 
 5 int Sum(int a, int b)
 6 {
 7     if (a - (int)a != 0 || b - (int)b != 0) {
 8         cout << "请输入整数" << endl;
 9         return -1;
10     }
11     return a + b;
12 }
复制代码

2、将C++代码编译成动态库dll

需要设置编译配置:
A:项目--属性---赔指数型--常规---配置类型---动态库(.dll)

 

 B:项目--属性--配置属性--C/C++---高级---编译为---便以为C++代码(/TP)

 这个活动X64注意,调用放C#最好也用这个X64;

然后点击项目--生成,就会看到dll了;

3、将dll拷贝到c#项目输入目录,一般在bin/debug下面;

4、编写C#代码调用dll

复制代码
 1 [DllImport("Calculate.dll", CallingConvention = CallingConvention.Cdecl)]
 2         extern static int Sum(int a, int b);
 3         public static void Main(string[] args) {
 4             try {
 5                 Console.WriteLine("请输入NumberA:");
 6                 int numberA = Convert.ToInt32(Console.ReadLine());
 7 
 8                 Console.WriteLine("请输入NumberB:");
 9                 int numberB = Convert.ToInt32(Console.ReadLine());
10 
11                 Console.WriteLine($"the numberA is:{numberA};numberB is:{numberB},The Sum is:{Sum(numberA, numberB)}");
12                
13             }
14             catch(Exception ex) {
15                 Console.WriteLine($"ex:{ex}");
16             }
17 
18             Console.ReadLine();
19         }
复制代码

主要是这两行:

这个“Sum”方法必须跟dll方法名字相同,否则找不到;

接下来看看运行结果:

很尴尬,提示找不到“Sum”方法,难道我们的操作有问题。

排查了很久,发现C++方法编译成dll时,方法名会改变,也是为了安全;

解决方案:

要把C++代码转化成C语言!

就这样,然后再编译dll过来,再次执行:

结果:成功

五、其他可能遇到的问题

A:对PInvoke函数的调用导致堆栈不对称问题

  方法定义加:CallingConvention = CallingConvention.Cdecl

B:未处理System.BadImageFormatException,试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

 

就这样OK了!。

六:思考:如果这个dll中有多个方法需要调用,

该怎么办,是否是这样,一个个声明引用??

 

posted on   一杯清酒邀明月  阅读(2953)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2020-08-04 Qt 让Label显示图片并把图片居中
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示