zoukankan      html  css  js  c++  java
  • C#如何调用C++(基础篇)

    闲暇之余,记一下笔记!记录一下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中有多个方法需要调用,

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

     

  • 相关阅读:
    消息路由的构成
    消息的构造
    消息传递通道
    消息传递系统
    EXtJS Ext.data.Model
    oracle coherence介绍及使用
    LINUX下安装和配置WEBLOGIC10.0.3
    WebLogic中"域"的概念
    WebLogic中的一些基本概念
    下属有能力却不服管,你该怎么办?
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/15097324.html
Copyright © 2011-2022 走看看