C++代码如下:
extern "C" __declspec(dllexport) int __stdcall add(int a, int b) {
return a + b;
}
因为是显示链接,所以只需要获得生成的dll即可
因为C#无法直接调用C++的dll,所以我们使用了extern"C"
使用vs自带的工具x86_x64 Cross Tools Command Prompt for VS 2022查看dll导出符号名称
确保导出符号名是正确的(和函数名称一致)再进行下一步操作
C#调用
C#代码如下:
using System;
using System.Runtime.InteropServices;
namespace Cshap12
{
internal class Program
{
[DllImport("D:/自用/vs的c++/Cshap12/add.dll", CallingConvention = CallingConvention.StdCall)]
static extern int add(int a,int b);
static void Main(string[] args)
{
try
{
Console.WriteLine(Convert.ToString(add(10, 10)));
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
CallingConvention.StdCall用来指定实现的调用约定,比如我们刚才C++编写的代码就是__stdcall
如果没有自己写明调用约定,就会使用默认调用约定__decl,C#也一样修改即可
如果有异常提示:提示"试图加载格式不正确的程序"
记得检查dll和c#的位数
如果你生成的dll是64位的,那么当前c#环境必须也是64位
其实也是非常的简单~~
Python调用
from ctypes import*;
dll = windll.LoadLibrary("./add.dll")
print(dll.add(3,4))
不得不说Python是在是太简单了,注意将dll放到Python项目的同级目录
我们可以搞一点复杂的
Python调用C++的类
c++代码如下:
#include<iostream>
#include<string>
class Num {
private:
int num = 0;
public:
void setValue(int num) {
this->num = num;
}
int getValue() {
return num;
}
};
extern "C" {
Num obj;
extern "C" __declspec(dllexport) int get_num() {
return obj.getValue();
}
extern "C" __declspec(dllexport)void set_num(int n) {
obj.setValue(n);
}
}
python测试代码:
from ctypes import*;
dll = windll.LoadLibrary("./add.dll")
print(dll.add(3,4))
dll2 = windll.LoadLibrary("./class");
print(dll2.get_num())
dll2.set_num(dll.add(5,5))
print(dll2.get_num())