C#调用C++方法,C#使用c++方法返回类或结构体
C#调用C++方法,C#使用c++方法返回类或结构体。
1. 在c++中定义结构体,类,处理方法;要给c#调用的方法要加extern "C" __declspec(dllexport) 修饰
// CppDll.cpp : Defines the exported functions for the DLL application. // #include "stdafx.h" #define EXPORT_DLL extern "C" __declspec(dllexport) //暴露的方法调用 EXPORT_DLL int Add( int a, int b) { return a + b; } //返回数据结构定义 struct Bar { public : int id; char * name; }; //使用引用返回结构 EXPORT_DLL void GetBar(Bar& bar) { //Bar b; bar.id = 10; bar.name = "hi bar 中文了" ; //bar = b; } //返回类 class Foo { public : int id; char * name; }; //引用返回类 EXPORT_DLL void GetFoo(Foo& foo) { foo.id = 100; foo.name = "I'm 傻瓜" ; } |
2. 在C#中使用C++方法,首先需要定义C++中的Foo(在c++中定义为类class),Bar(在C++中定义为struct)对应的数据结构struct;然后定义extern的方法,如下代码所示:
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace UseCppDll { [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] public struct Bar { /// int public int id; /// char* [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)] public string name; } [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] public struct Foo { /// int public int id; /// char* [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)] public string name; } class Program { [DllImport( "CppDll.dll" ,EntryPoint= "Add" )] extern static int Add( int a, int b); [DllImport( "CppDll.dll" , EntryPoint = "GetBar" ,CharSet=CharSet.Ansi)] extern static void GetBar( ref Bar bar); [DllImport( "CppDll.dll" , EntryPoint = "GetFoo" , CharSet = CharSet.Ansi)] extern static void GetFoo( ref Foo foo); static void Main( string [] args) { Console.WriteLine(Add(5,4)); Bar b = new Bar(); GetBar( ref b); Console.WriteLine( "b's id is " + b.id); Console.WriteLine( "b's name is " + b.name); Foo f = new Foo(); GetFoo( ref f); Console.WriteLine( "f's id is " + f.id); Console.WriteLine( "f's name is " + f.name); Console.Read(); } } } |
C++中的类或者结构在C#中的定义代码可以使用微软提供的工具(P/Invoke Interop Assistant)生成。
在运行C#程序前要把C++dll复制到C#程序运行目录下。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2007-04-27 复活吧,架构师!