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

posted @ 2019-10-31 20:34  明&天  阅读(13476)  评论(1编辑  收藏