You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,在属性窗口设置复制到输出目录为始终复制或如果较新则复制

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 20:13:12