x86下C#引用C++ DLL正常,x64平台添加引用失败如何解决?
x64平台下C++原生DLL无法被C#项目通过引用管理器添加的解决方法
问题场景
使用Microsoft Visual Studio Professional 2019编写C++加法函数生成DLL,在C#项目中调用:
- Win32平台:将C++ DLL与C#程序的活动平台均设为Win32时,通过引用管理器“Add reference”添加后可正常构建运行
- x64平台:两者活动平台均设为x64时,通过引用管理器添加引用会弹出错误,无法完成引用添加,因工作需求必须使用x64平台,需调整哪些设置?
相关代码
C++源文件
#include "pch.h" #include "Divide.h" Divide::Divide(int x) { this->x = x; } int Divide::adding(int y) { return this->x + y; } int Divide::get() { return this->x; } extern "C" __declspec(dllexport) void* Create(int x) { return (void*) new Divide(x); } extern "C" __declspec(dllexport) int DivideAdding(Divide * a, int y) { return a->adding(y); } extern "C" __declspec(dllexport) int DivideGet(Divide * a) { return a->get(); }
C++头文件
class Divide { int x; public: Divide(int x); int adding(int y); int get(); };
C#代码片段
[DllImport("DivideDLL.dll", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr Create(int x); [DllImport("DivideDLL.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int DivideAdding(IntPtr a, int y); [DllImport("DivideDLL.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int DivideGet(IntPtr a); static void Main(string[] args) { try { IntPtr a = Create(5); int temp = DivideGet(a); Console.WriteLine("Initial:" + temp); DivideAdding(a, 10);
核心问题说明
C++生成的原生DLL(非COM/CLI封装的托管DLL)本身不支持通过VS的引用管理器(Add Reference)直接添加。Win32平台下看似能添加是假象,实际生效的原因是DLL被复制到了输出目录,而非引用管理器的引用机制。
x64平台配置步骤
1. 确保C++ DLL项目的x64构建配置正确
- 打开C++ DLL项目属性,切换到x64平台:
- 确认
常规->目标平台为x64 - 确认
链接器->高级->目标文件格式为x64(默认自动匹配平台) - 构建项目,生成x64版本的
DivideDLL.dll
- 确认
2. 调整C#项目配置并手动部署DLL
C#项目无法通过引用管理器添加原生DLL,需手动处理:
- 打开C#项目属性,切换到x64平台:
- 确认
生成->平台目标为x64,取消勾选首选32位
- 确认
- 将x64版本的
DivideDLL.dll复制到C#项目的x64输出目录(默认是bin\x64\Debug或bin\x64\Release) - (可选)为了自动同步DLL,可将其添加到C#项目:
- 右键C#项目 ->
添加->现有项,选中DivideDLL.dll - 选中DLL,在属性窗口设置
复制到输出目录为始终复制或如果较新则复制
- 右键C#项目 ->
3. 验证C#调用的正确性
现有C#代码的DllImport调用方式是正确的,需补充完整代码避免语法错误:
static void Main(string[] args) { try { IntPtr a = Create(5); int temp = DivideGet(a); Console.WriteLine("Initial:" + temp); int result = DivideAdding(a, 10); Console.WriteLine("Result after adding 10: " + result); // 建议添加C++导出的销毁函数释放内存,避免泄漏 // 比如C++中添加:extern "C" __declspec(dllexport) void Destroy(Divide* a) { delete a; } // 再在C#中添加对应的DllImport并调用 } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } Console.ReadKey(); }
4. 常见问题排查
- 若运行时提示找不到DLL:检查x64版本DLL是否放到了C#项目的x64输出目录
- 若出现
BadImageFormatException:确认C++和C#项目的平台均为x64,无32/64位组件混合
内容的提问来源于stack exchange,提问作者Rajesh Kontham
相关产品推荐
相关产品推荐

