C#如何调用C++(基础篇)
闲暇之余,记一下笔记!记录一下c#如何调用C++的动态库(dll).
步骤:
一、创建一个C++类,例如:
AddOperate.h
extern _declspec(dllexport) int Sum(int a, int b); class AddOperate { public : };
AddOperate.cpp
#include "AddOperate.h" #include "iostream" using namespace std; int Sum(int a, int b) { if (a - (int)a != 0 || b - (int)b != 0) { cout << "请输入整数" << endl; return -1; } return a + b; }
2、将C++代码编译成动态库dll
需要设置编译配置:
A:项目--属性---赔指数型--常规---配置类型---动态库(.dll)
B:项目--属性--配置属性--C/C++---高级---编译为---便以为C++代码(/TP)
这个活动X64注意,调用放C#最好也用这个X64;
然后点击项目--生成,就会看到dll了;
3、将dll拷贝到c#项目输入目录,一般在bin/debug下面;
4、编写C#代码调用dll
[DllImport("Calculate.dll", CallingConvention = CallingConvention.Cdecl)] extern static int Sum(int a, int b); public static void Main(string[] args) { try { Console.WriteLine("请输入NumberA:"); int numberA = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("请输入NumberB:"); int numberB = Convert.ToInt32(Console.ReadLine()); Console.WriteLine($"the numberA is:{numberA};numberB is:{numberB},The Sum is:{Sum(numberA, numberB)}"); } catch(Exception ex) { Console.WriteLine($"ex:{ex}"); } Console.ReadLine(); }
主要是这两行:
这个“Sum”方法必须跟dll方法名字相同,否则找不到;
接下来看看运行结果:
很尴尬,提示找不到“Sum”方法,难道我们的操作有问题。
排查了很久,发现C++方法编译成dll时,方法名会改变,也是为了安全;
解决方案:
要把C++代码转化成C语言!
就这样,然后再编译dll过来,再次执行:
结果:成功
五、其他可能遇到的问题
A:对PInvoke函数的调用导致堆栈不对称问题
方法定义加:CallingConvention = CallingConvention.Cdecl
B:未处理System.BadImageFormatException,试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)
就这样OK了!。
六:思考:如果这个dll中有多个方法需要调用,
该怎么办,是否是这样,一个个声明引用??
预知结果,请看下一篇文章:《C#如何调用C++(进阶篇)》,地址:https://www.cnblogs.com/skyfreedom/p/11783629.html
没有什么优雅的代码比空代码的执行效率更高
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示