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

无法在C#项目中添加C++ DLL引用:原因及解决方法

错误成因
  • 你生成的是原生C++ DLL,而非.NET托管程序集。Visual Studio的「添加引用」功能仅支持托管程序集、COM组件这类符合.NET规范的组件,原生DLL无法通过该方式添加引用,这是报错的核心原因。
  • 另外,当前C++代码中的myFunction没有被导出到DLL的导出表中,即便能加载DLL,C#也无法找到该函数。
解决步骤

要在C#中调用原生C++ DLL,需使用P/Invoke(平台调用),具体操作如下:

1. 修改C++代码,确保函数被导出

修改setup.h,添加导出宏,让函数被DLL导出:

#ifndef SETUP_DLL
// Windows平台下用__declspec(dllexport)标记导出函数
#define SETUP_DLL __declspec(dllexport)
#endif

// 用宏标记要导出的函数
SETUP_DLL int myFunction();

为避免C++函数名称被编译器修饰(名字 mangling),可以在setup.cpp中用extern "C"包裹代码:

extern "C" {
#include "setup.h"

int myFunction() {
    return 42;
}
}

2. 重新编译C++ DLL

  • 确保编译的DLL与C#项目的目标架构一致(比如C#项目设为x64,C++项目也要编译x64版本,否则会出现加载失败)。
  • 编译后会在lib目录生成如MyLibrary_1.0.0.dll的文件。

3. 在C#项目中通过P/Invoke调用函数

无需添加引用,直接在C#代码中声明外部函数并调用:

using System;
using System.Runtime.InteropServices;

class Program
{
    // 声明外部函数,注意DLL名称要和生成的文件名一致
    [DllImport("MyLibrary_1.0.0.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern int myFunction();

    static void Main(string[] args)
    {
        int result = myFunction();
        Console.WriteLine($"调用结果:{result}"); // 输出42
    }
}

4. 确保C#程序能找到DLL

  • 把生成的C++ DLL复制到C#项目的输出目录(比如bin/Debug/x64);
  • 或者在C#项目中添加DLL文件,设置其「复制到输出目录」属性为「如果较新则复制」。
注意事项
  • 调用约定匹配:C++默认使用Cdecl调用约定,C#中必须在DllImport里指定CallingConvention = CallingConvention.Cdecl,否则会导致栈溢出错误。
  • 架构一致性:C++ DLL和C#项目的目标平台(x86/x64/ARM)必须完全一致,否则会出现「无法加载DLL」的错误。

内容的提问来源于stack exchange,提问作者El_Merendero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:45:20