C#如何调用C++的DLL?P/Invoke与C++/CLI动态链接库调用方法详解


答案是P/Invoke适用于简单C风格函数调用,C++/CLI适合复杂C++类交互;前者轻量但受限,后者灵活但需托管包装。

c#如何调用c++的dll?p/invoke与c++/cli动态链接库调用方法详解

在C#中调用C++编写的DLL,主要有两种方式:P/Invoke(平台调用)和C++/CLI。选择哪种方式取决于你的需求、性能要求以及是否需要跨语言复杂类型交互。

P/Invoke:适用于纯C风格导出函数

当C++ DLL以C接口形式导出函数(即使用extern "C"防止C++名称修饰),并且传递的是基本数据类型或简单结构体时,推荐使用P/Invoke。

步骤如下:

  • 确保C++ DLL导出C兼容函数
  • 在C#中声明对应的DllImport方法
  • 正确映射参数和返回值类型

C++ DLL 示例(mycppdll.h):

extern "C" {
  __declspec(dllexport) int Add(int a, int b);
  __declspec(dllexport) void GetString(char* buffer, int bufferSize);
}

C# 调用代码:

using System;
using System.Runtime.InteropServices;

class Program {
  [DllImport("mycppdll.dll", CallingConvention = CallingConvention.Cdecl)]
  public static extern int Add(int a, int b);

  [DllImport("mycppdll.dll", CallingConvention = CallingConvention.Cdecl)]
  public static extern void GetString(StringBuilder buffer, int bufferSize);

  static void Main() {
    int result = Add(3, 5);
    Console.WriteLine("Add result: " + result);

    var sb = new StringBuilder(256);
    GetString(sb, sb.Capacity);
    Console.WriteLine("String from C++: " + sb.ToString());
  }
}

注意事项:

  • 调用约定必须匹配(常见为Cdecl或StdCall)
  • 字符串传递需使用StringBuilder或IntPtr配合Marshal操作
  • 复杂结构体需用StructLayout和MarshalAs显式布局

C++/CLI:桥接C++与.NET的中间层

当你需要调用C++类、模板、STL容器,或者涉及复杂的对象生命周期管理时,P/Invoke难以胜任。此时应使用C++/CLI创建一个“托管包装器”DLL。

优点:

万彩商图 万彩商图

专为电商打造的AI商拍工具,快速生成多样化的高质量商品图和模特图,助力商家节省成本,解决素材生产难、产图速度慢、场地设备拍摄等问题。

万彩商图 212 查看详情 万彩商图
  • 可直接调用原生C++类和方法
  • 支持面向对象设计(如继承、多态)
  • 自动处理内存和异常转换

实现步骤:

  1. 创建C++/CLI类库项目(.NET Framework)
  2. 包含原生C++头文件并链接LIB文件
  3. 编写ref class作为托管接口
  4. C#项目引用生成的DLL

C++/CLI 包装示例(Wrapper.h):

// 原生C++类
class NativeMath {
public:
  int Multiply(int x, int y);
};

// 托管包装类
public ref class ManagedMath {
private:
  NativeMath* native;

public:
  ManagedMath() {
    native = new NativeMath();
  }

  ~ManagedMath() {
    delete native;
  }

  int Multiply(int x, int y) {
    return native->Multiply(x, y);
  }
};

C# 调用代码:

class Program {
  static void Main() {
    var math = new ManagedMath();
    int result = math.Multiply(4, 7);
    Console.WriteLine("Multiply result: " + result);
  }
}

关键点:

  • C++/CLI项目输出为混合程序集(含托管和本地代码)
  • 必须针对具体平台编译(x86/x64),不支持AnyCPU
  • 注意异常转换(C++异常不能直接抛给C#)

如何选择合适的方法?

根据实际场景判断:

  • 如果DLL只提供简单函数接口,且参数为int、double、char*等基础类型,用P/Invoke更轻量
  • 若需调用C++类、重载函数、虚函数或多态行为,C++/CLI是唯一可行方案
  • 团队具备C++能力时,C++/CLI灵活性更高;否则优先考虑封装成C接口

基本上就这些。两种方式都能有效打通C#与C++的壁垒,关键是理解各自边界和适用范围。

以上就是C#如何调用C++的DLL?P/Invoke与C++/CLI动态链接库调用方法详解的详细内容,更多请关注其它相关文章!


# ai  # app  # 你在  # 面向对象  # 多态  # lsp  # .net  # c#  # c++  # seo01破解视频  # 金华定制网站建设报价查询  # 阳泉网站优化排名  # 湘潭app营销推广公司  # 直播营销场景社交式推广  # 常州网站建设和制作公司  # 汉中网站优化案例  # seo工作好  # 荷兰网站建设公司  # 谷歌seo推广比较  # 互斥  # 有哪些  # 的是  # 游戏开发  # 如何使用  # 动态链接库  # 适用于 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践  QQ邮箱PC端登录页面_QQ邮箱网页版登录界面  苹果自助维修计划支持哪些设备机型  如何在vscode中关闭it环境  OPPO A3 WiFi频繁断开怎么办 OPPO A3网络优化技巧  Win10运行窗口在哪里打开 Win10调出运行命令框快捷键【技巧】  第五人格PC版怎么避免被封号_第五人格PC版防封号注意事项  抖音号怎么解除企业认证改成个人?改成个人有影响吗?  在XML中嵌入二进制数据(如图片)的最佳实践是什么? Base64编码与解析注意事项  喜茶GO更换登录账号方法  豆包AI怎样为教育场景定制答疑逻辑_为教育场景定制豆包AI答疑逻辑方案【方案】  sublime如何配置PHP开发环境_在sublime中运行与调试PHP代码  《饿了么》拼好饭点外卖教程2025  Animex动漫社社登录官网 Animex动漫社资源社入口直达  WPS文字如何进行简繁转换  Python csv 模块处理非字符串数据:列表写入 CSV 文件的机制解析  Scipy Sparse CSR 矩阵非零元素行级遍历的最佳实践  J*a列表元素格式化输出教程  多闪APP官方下载安装入口_多闪最新版本获取入口  从HTML表单获取逗号分隔值并转换为NumPy数组进行预测  《书耽》更换手机号方法  研招网官方网站招生平台入口_中国研究生招生信息网官网登录  iPhone14开启Apple TV遥控设置  如何查询个人病历记录  Teambition网盘如何共享文件  Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧  Cassandra中复合主键、二级索引与ORDER BY排序的限制与解决方案  《顺丰同城骑士》查看我的技能方法  TikTok视频播放不流畅怎么办 TikTok视频播放优化方法  《漫蛙manwa2》防走失网页版链接2025  Final Cut Pro视频加EQ教程  Go语言反射机制:如何访问被嵌入结构体遮蔽的方法  《腾讯相册管家》注销账号方法  PDF文件去水印平台入口 PDF水印删除网址  斯宾塞称XGP云游戏“蒸蒸日上”:正在构建一个游戏从未如此唾手可得的未来  一点万象签到领积分指南  解决 Vue 3 组件未定义错误:理解 createApp 与根组件的正确使用  酷狗音乐多音轨设置教程  抖音赚钱快速入门_新手必看的抖音赚钱步骤  如何用Golang优化微服务间请求性能_Golang 微服务请求性能优化方法  抖音小程序怎么开通?小程序开通条件是什么?  《360浏览器》自动保存账号密码设置方法  vivo手机视频通话美颜怎么设置_vivo视频通话美颜开启方法  t3出行如何使用微信支付  中通快递官网指定查询 中通快递单号查询平台入口  LINUX怎么查看显卡信息_LINUX查看GPU状态  Safari浏览器自动填表功能失效怎么办 Safari表单管理修复  如何自定义苹果手机铃声  支付宝如何解绑云闪付_支付宝与云闪付账户关联解除方法  告别繁琐SEO!如何使用SyliusSitemap插件自动化生成网站地图,提升搜索引擎排名 

 2025-11-25

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.