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 != || b - (int)b != ) {
cout << "请输入整数" << endl;
return -;
}
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
C#如何调用C++(基础篇)的更多相关文章
- C#多线程之基础篇2
在上一篇C#多线程之基础篇1中,我们主要讲述了如何创建线程.中止线程.线程等待以及终止线程的相关知识,在本篇中我们继续讲述有关线程的一些知识. 五.确定线程的状态 在这一节中,我们将讲述如何查看一个线 ...
- C#多线程之基础篇1
在多线程这一系列文章中,我们将讲述C#语言中多线程的相关知识,在多线程(基础篇)中我们将学习以下知识点: 创建线程 中止线程 线程等待 终止线程 确定线程的状态 线程优先级 前台线程和后台线程 向线程 ...
- iOS系列 基础篇 03 探究应用生命周期
iOS系列 基础篇 03 探究应用生命周期 目录: 1. 非运行状态 - 应用启动场景 2. 点击Home键 - 应用退出场景 3. 挂起重新运行场景 4. 内存清除 - 应用终止场景 5. 结尾 本 ...
- iOS系列 基础篇 04 探究视图生命周期
iOS系列 基础篇 04 探究视图生命周期 视图是应用的一个重要的组成部份,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 以视图的四种状态为基础,我们来系统了解一下视 ...
- iOS系列 基础篇 08 文本与键盘
iOS系列 基础篇 08 文本与键盘 目录: 1. 扯扯犊子 2. TextField 3. TextView 4. 键盘的打开和关闭 5. 打开/关闭键盘的通知 6. 键盘的种类 7. 最后再扯两句 ...
- [译]RxJS 5.X基础篇
欢迎指错与讨论 : ) 当前RxJS版本:5.0.0-beta.10.更详细的内容尽在RxJS官网http://reactivex.io/rxjs/manual/overview.html.文章比较长 ...
- iOS10 推送必看(基础篇)
虽然这篇文章比较长,也不好理解,但是还是建议大家收藏,以后用到的时候,可以看看,有耐心的还是读一读. 这篇文章开始,我会跟大家好好讲讲,苹果新发布的iOS10的所有通知类. 一.创建本地通知事例详解: ...
- [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析
[WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...
- oracle(sql)基础篇系列(五)——PLSQL、游标、存储过程、触发器
PL/SQL PL/SQL 简介 每一种数据库都有这样的一种语言,PL/SQL 是在Oracle里面的一种编程语言,在Oracle内部使用的编程语言.我们知道SQL语言是没有分支和循环的,而PL语 ...
随机推荐
- gitment初始化评论跳回博客首页
表现 众所周知,gitment评论系统需要初始化以创建对应的issue,可是我在点击login with github的时候,总是跳向博客首页!WTF!什么鬼?这样不程序啊? 排查 1.F12查看lo ...
- delphi 获得父目录–指定级父目录
function get_dir_parent(dir:string;n:integer):string; //n为几级父目录varst:string;i:integer;begin st:=GetC ...
- 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_02-用户认证技术方案-单点登录
2 用户认证技术方案 2.1 单点登录技术方案 分布式系统要实现单点登录,通常将认证系统独立抽取出来,并且将用户身份信息存储在单独的存储介质,比如: MySQL.Redis,考虑性能要求,通常存储在R ...
- Arduino---HC-05 蓝牙模块
蓝牙基础知识回顾: (一)Arduino和HC-05连接 注意:Arduino通过TX与HC-05进行通信,而Arduino的电压为5V,HC-05的允许电压为3.3V.短时间通信无妨(长时间可能烧毁 ...
- 123457123457---com.threeObj03.MaJiangertong--- 记忆翻牌益智游戏
com.threeObj03.MaJiangertong--- 记忆翻牌益智游戏
- MySQL函数使用
1.mysql开启函数功能 MySQL函数不能创建的解决方法 在使用MySQL数据库时,有时会遇到mysql函数不能创建的情况. 出错信息大致类似: ERROR 1418 (HY000): This ...
- Python源码编译安装,supervisor配置管理
apt-get remove 会删除软件包而保留软件的配置文件 apt-get purge 会同时清除软件包和软件的配置文件 virtualenv -p /usr/local/bin/python3. ...
- 异地协作,A地上传jar包到B地服务器上传速率慢
在A地使用ftp服务器,再登录B地的目标服务器,使用ftp命令从ftp服务器下载文件,速度快点,下载带宽比上传带宽要大一点 https://blog.csdn.net/df0128/article/d ...
- 接着上次的python爬虫,今天进阶一哈,局部解析爬取网页数据
*解析网页数据的仓库 用Beatifulsoup基于lxml包lxml包基于html和xml的标记语言的解析包.可以去解析网页的内容,把我们想要的提取出来. 第一步.导入两个包,项目中必须包含beau ...
- sersync参数说明
-v, --verbose 详细模式输出-q, --quiet 精简输出模式-c, --checksum 打开校验开关,强制对文件传输进行校验-a, --archive 归档模式,表示以递归方式传输文 ...