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("D:/自用/vs的c++/vs_py/add.dll")
print(dll.add(3,4))
不得不说Python是在是太简单了