一、VS新建C++空项目
CTestDll.h
#ifndef __CTEST_DLL_H #define __CTEST_DLL_H // 声明为C编译、链接方式为外部函数 extern "C" _declspec(dllexport) int _cdecl add(int* x, int* y); extern "C" _declspec(dllexport) int _cdecl sub(int x, int y); #endif
CTestDll.cpp
#include "CTestDll.h" #ifdef __cplusplus //如果是cpp文件 extern "C" //这部分代码按C编译 { int add(int* x, int* y) { return *x + *y; } int sub(int x, int y) { return x - y; } } #endif
可能会出现的报错
重定义解决方法 (调用约定要与代码中写的一致)
不兼容解决方法
二、VS新建C#控制台项目using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; namespace ConsoleApp6 { class Program { [DllImport(@"Dll4.dll", EntryPoint = "add", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] public static extern int add(ref int x, ref int y); [DllImport(@"Dll4.dll", EntryPoint = "sub", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] public static extern int sub(int x, int y); static void Main(string[] args) { int x = 6, y = 5; int a = add(ref x, ref y); int b = sub(x, y); Console.WriteLine("a={0}, b={1}", a, b); Console.Read(); } } }将C项目编译成dll并拷到bin\x64\Debug下面(即,与C#生成的exe文件同目录)
注意,64位的C#项目无法调用32位的DLL,这里的测试工程统一编译成64位。
运行测试