C# 调用 C++ DLL方法
在C# 中,可以通过 DllImport 调用C++ 的非托管DLL程序。
VS2010中C#调用C++的DLL示例:
一、新建C++ DLL程序
1、新建 C++ Win32项目,类型为DLL。
生成的文件结构如图:
其中,“MyDLLFun.cpp”文件为此项目主要源文件。
2、在源文件中添加需要被外部调用的方法。
这里仅仅是添加两个示例方法:
方法“Add”返回两个整数的和;方法Pow计算X 的 Y 次方,并以指针的形式修改参数 x 地址处的值。
修饰符 extern "C" 包含双重含义:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。而被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。
__declspec(dllexport)的目的是为了将对应的函数放入到DLL动态库中。
extern "C" __declspec(dllexport)加起来的目的是为了使用DllImport调用非托管C++的DLL文件。因为使用DllImport只能调用由C语言函数做成的DLL。
添加完方法后,编译生成DLL文件。
二、在C#中使用DLL程序。
首先,将新生成的都来了拷贝到C#工程bin\Debug目录下。
然后,利用DllImport导入DLL程序中的方法,为方便管理,新建一个名为CppDll的类,并在此导入DLL方法:
说明:1)需要引用命名空间 using System.Runtime.InteropServices;
2)建议增加特性 CallingConvention= CallingConvention.Cdecl,不然可能会出现 “堆栈不对称”错误:
3)DLL中的方法,必须申明为 static,extern 的。
最后,在需要的地方调用这些方法即可。
说明:C++中函数Pow中传的为指针,也即是变量的地址,在C#修饰符 ref 即表示“传址”,所以C++中的 int*对应于 C#中的ref int
三、稍微扩展一下,在函数中传递数组。
在C++中添加函数
在C++中,函数参数为数组时传递的为数组的首地址,和数组的长度,如上。那么对应于C#中就应该是:
其中 ref double ary 为某个double类型数组的第一个元素的地址,len为数组长度。
调用时则写为:
懒一点,就用一个字符串查看结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异