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#代码如下:
- 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位

其实也是非常的简单~~
-
- from ctypes import*;
-
- dll = windll.LoadLibrary("./add.dll")
-
- print(dll.add(3,4))
不得不说Python是在是太简单了,注意将dll放到Python项目的同级目录
我们可以搞一点复杂的
c++代码如下:
- #include
- #include
-
- 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())