闲暇之余,记一下笔记!记录一下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++(基础篇)的更多相关文章

  1. C#多线程之基础篇2

    在上一篇C#多线程之基础篇1中,我们主要讲述了如何创建线程.中止线程.线程等待以及终止线程的相关知识,在本篇中我们继续讲述有关线程的一些知识. 五.确定线程的状态 在这一节中,我们将讲述如何查看一个线 ...

  2. C#多线程之基础篇1

    在多线程这一系列文章中,我们将讲述C#语言中多线程的相关知识,在多线程(基础篇)中我们将学习以下知识点: 创建线程 中止线程 线程等待 终止线程 确定线程的状态 线程优先级 前台线程和后台线程 向线程 ...

  3. iOS系列 基础篇 03 探究应用生命周期

    iOS系列 基础篇 03 探究应用生命周期 目录: 1. 非运行状态 - 应用启动场景 2. 点击Home键 - 应用退出场景 3. 挂起重新运行场景 4. 内存清除 - 应用终止场景 5. 结尾 本 ...

  4. iOS系列 基础篇 04 探究视图生命周期

    iOS系列 基础篇 04 探究视图生命周期 视图是应用的一个重要的组成部份,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 以视图的四种状态为基础,我们来系统了解一下视 ...

  5. iOS系列 基础篇 08 文本与键盘

    iOS系列 基础篇 08 文本与键盘 目录: 1. 扯扯犊子 2. TextField 3. TextView 4. 键盘的打开和关闭 5. 打开/关闭键盘的通知 6. 键盘的种类 7. 最后再扯两句 ...

  6. [译]RxJS 5.X基础篇

    欢迎指错与讨论 : ) 当前RxJS版本:5.0.0-beta.10.更详细的内容尽在RxJS官网http://reactivex.io/rxjs/manual/overview.html.文章比较长 ...

  7. iOS10 推送必看(基础篇)

    虽然这篇文章比较长,也不好理解,但是还是建议大家收藏,以后用到的时候,可以看看,有耐心的还是读一读. 这篇文章开始,我会跟大家好好讲讲,苹果新发布的iOS10的所有通知类. 一.创建本地通知事例详解: ...

  8. [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析

    [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...

  9. oracle(sql)基础篇系列(五)——PLSQL、游标、存储过程、触发器

      PL/SQL PL/SQL 简介 每一种数据库都有这样的一种语言,PL/SQL 是在Oracle里面的一种编程语言,在Oracle内部使用的编程语言.我们知道SQL语言是没有分支和循环的,而PL语 ...

随机推荐

  1. imfilter

    图像处理函数详解——imfilter功能:对任意类型数组或多维图像进行滤波.用法:B = imfilter(A,H) B = imfilter(A,H,option1,option2,...) 或写作 ...

  2. MySQL实时监听——EPX 原创: 奕X 贝壳产品技术 今天

    MySQL实时监听——EPX 原创: 奕X 贝壳产品技术 今天

  3. IO操作之BIO、NIO、AIO

    一.BIO Blocking IO: 同步阻塞的编程方式. BIO编程方式通常是在JDK1.4版本之前常用的编程方式.编程实现过程为:首先在服务端启动一个ServerSocket来监听网络请求,客户端 ...

  4. java模拟post进行文件提交 采用httpClient方法

    package com.jd.vd.manage.util.filemultipart; import java.io.BufferedReader;import java.io.File;impor ...

  5. jvm 指令重排

    引言:在Java中看似顺序的代码在JVM中,可能会出现编译器或者CPU对这些操作指令进行了重新排序:在特定情况下,指令重排将会给我们的程序带来不确定的结果..... 1.  什么是指令重排? 在计算机 ...

  6. QML异常:Cannot anchor to an item that isn't a parent or sibling

    翻译: 无法定位到不是父项或同级项的项 QML的anchor必须定位父级对象或者同级对象,不能定位到其他如:同级对象的子对象

  7. (六)利用JackSon工具将JSON文件和对象互转

    1. 需要下载JackSon工具,并导入到: 2. 编写html页面: <!DOCTYPE html> <html> <head> <meta charset ...

  8. Hibernatne 缓存中二级缓存简单介绍

    hibernate的session提供了一级缓存,每个session,对同一个id进行两次load,不会发送两条sql给数据库,但是session关闭的时候,一级缓存就失效了. 二级缓存是Sessio ...

  9. django model的update时auto_now不被更新的原因

    gmt_create自动添加auto_now_add:gmt_modify自动更新auto_now class CommonInfo(models.Model): """ ...

  10. 为什么每次登录要手动 source /etc/profile ...

    由于执行顺序如下,故追个查看以下文件,看看是不是 JAVA_HOME, PATH 等环境变量在后面的文件中被重写覆盖了. 1. /etc/profile2. /etc/environment3. ~/ ...