首页 > 编程语言 >C# 如何调用C++ dll string类型返回

C# 如何调用C++ dll string类型返回

时间:2023-08-05 16:12:46浏览次数:41  
标签:char string C# System c++ ---- c# C++ 变量名

这篇文章主要介绍了C# 如何调用C++ dll string类型返回问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教   −

目录

C#调用C++ dll string类型返回

为了这个问题,百度了一堆不靠谱的资料,什么C#调用c++类型对应啥的,说用string ,StringBuilder,Byte[]等,试了全部不行。

其实是个很简单的问题,这里做个记录吧:

C++端:(定义返回数据为结构体Vector4)

1 2 3 4 5 struct Vector4 {     float A, B, C;     const char* D; };

C#端:(接收返回的结构体Vector4)

1 2 3 4 5 6 [StructLayout(LayoutKind.Sequential)] struct Vector4 {     public float A, B, C;     public IntPtr D; }

其实就很简单一句话,用IntPtr接收char* 参数就完事了。

InrPtr:用于表示指针或句柄的平台特定类型;接收到IntPtr数据之后,进行一个数据转换就行了:

1 2 3 4 5 6 7 8 9 10 //与Int互转 int i=1; IntPtr p=new IntPtr(i);  int ch_i=(int) p;    //与string互转 string str="a"; IntPtr p=Marshal.StringToHGlobalAnsi(str); string s=Marshal.PtrToStringAnsi(p); Marshal.FreeHGlobal(p)

C#调用C++ dll类型对照表汇总

函数调用导致堆栈不对称。

原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配,在dllimport中加入CallingConvention参数就行了,

1 [DllImport(PCAP_DLL, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]

要注意C++与NET中数据类型的对应 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 //c++:char * ---- c#:string //传入参数   //c++:char * ---- c#:StringBuilder//传出参数   //c++:char *变量名 ---- c#:ref string 变量名   //c++:char *输入变量名 ---- c#:string 输入变量名   //c++:char *输出变量名 ---- c#:[MarshalAs(UnmanagedType.LPStr)] StringBuilder 输出变量名   //c++:SHORT(short) ---- c#:System.Int16   //c++:LONG(long) ---- c#:System.Int32       //C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试   //c++:HANDLE(void *) ---- c#:System.IntPtr   //c++:Byte(unsigned char) ---- c#:System.Byte   //c++:SHORT(short) ---- c#:System.Int16   //c++:WORD(unsigned short) ---- c#:System.UInt16   //c++:INT(int) ---- c#:System.Int16   //c++:INT(int) ---- c#:System.Int32   //c++:UINT(unsigned int) ---- c#:System.UInt16   //c++:UINT(unsigned int) ---- c#:System.UInt32   //c++:LONG(long) ---- c#:System.Int32   //c++:ULONG(unsigned long) ---- c#:System.UInt32   //c++:DWORD(unsigned long) ---- c#:System.UInt32   //c++:DECIMAL ---- c#:System.Decimal   //c++:BOOL(long) ---- c#:System.Boolean   //c++:CHAR(char) ---- c#:System.Char   //c++:LPSTR(char *) ---- c#:System.String   //c++:LPWSTR(wchar_t *) ---- c#:System.String   //c++:LPCSTR(const char *) ---- c#:System.String   //c++:LPCWSTR(const wchar_t *) ---- c#:System.String   //c++:PCAHR(char *) ---- c#:System.String   //c++:BSTR ---- c#:System.String   //c++:FLOAT(float) ---- c#:System.Single   //c++:DOUBLE(double) ---- c#:System.Double   //c++:VARIANT ---- c#:System.Object   //c++:PBYTE(byte *) ---- c#:System.Byte[]         //c++:BSTR ---- c#:StringBuilder   //c++:LPCTSTR ---- c#:StringBuilder   //c++:LPCTSTR ---- c#:string   //c++:LPTSTR ---- c#:[MarshalAs(UnmanagedType.LPTStr)] string   //c++:LPTSTR 输出变量名 ---- c#:StringBuilder 输出变量名   //c++:LPCWSTR ---- c#:IntPtr   //c++:BOOL ---- c#:bool     //c++:HMODULE ---- c#:IntPtr     //c++:HINSTANCE ---- c#:IntPtr   //c++:结构体 ---- c#:public struct 结构体{};   //c++:结构体 **变量名 ---- c#:out 变量名 //C#中提前申明一个结构体实例化后的变量名   //c++:结构体 &变量名 ---- c#:ref 结构体 变量名              //c++:WORD ---- c#:ushort   //c++:DWORD ---- c#:uint   //c++:DWORD ---- c#:int         //c++:UCHAR ---- c#:int   //c++:UCHAR ---- c#:byte   //c++:UCHAR* ---- c#:string   //c++:UCHAR* ---- c#:IntPtr         //c++:GUID ---- c#:Guid   //c++:Handle ---- c#:IntPtr   //c++:HWND ---- c#:IntPtr   //c++:DWORD ---- c#:int   //c++:COLORREF ---- c#:uint         //c++:unsigned char ---- c#:byte   //c++:unsigned char * ---- c#:ref byte   //c++:unsigned char * ---- c#:[MarshalAs(UnmanagedType.LPArray)] byte[]   //c++:unsigned char * ---- c#:[MarshalAs(UnmanagedType.LPArray)] Intptr         //c++:unsigned char & ---- c#:ref byte   //c++:unsigned char 变量名 ---- c#:byte 变量名   //c++:unsigned short 变量名 ---- c#:ushort 变量名   //c++:unsigned int 变量名 ---- c#:uint 变量名   //c++:unsigned long 变量名 ---- c#:ulong 变量名         //c++:char 变量名 ---- c#:byte 变量名 //C++中一个字符用一个字节表示,C#中一个字符用两个字节表示   //c++:char 数组名[数组大小] ---- c#:MarshalAs(UnmanagedType.ByValTStr, SizeConst = 数组大小)] public string 数组名; ushort         //c++:char * ---- c#:string //传入参数   //c++:char * ---- c#:StringBuilder//传出参数   //c++:char *变量名 ---- c#:ref string 变量名   //c++:char *输入变量名 ---- c#:string 输入变量名   //c++:char *输出变量名 ---- c#:[MarshalAs(UnmanagedType.LPStr)] StringBuilder 输出变量名         //c++:char ** ---- c#:string   //c++:char **变量名 ---- c#:ref string 变量名   //c++:const char * ---- c#:string   //c++:char[] ---- c#:string   //c++:char 变量名[数组大小] ---- c#:[MarshalAs(UnmanagedType.ByValTStr,SizeConst=数组大小)] public string 变量名;         //c++:struct 结构体名 *变量名 ---- c#:ref 结构体名 变量名   //c++:委托 变量名 ---- c#:委托 变量名         //c++:int ---- c#:int   //c++:int ---- c#:ref int   //c++:int & ---- c#:ref int   //c++:int * ---- c#:ref int //C#中调用前需定义int 变量名 = 0;      //c++:*int ---- c#:IntPtr   //c++:int32 PIPTR * ---- c#:int32[]   //c++:float PIPTR * ---- c#:float[]           //c++:double** 数组名 ---- c#:ref double 数组名   //c++:double*[] 数组名 ---- c#:ref double 数组名   //c++:long ---- c#:int   //c++:ulong ---- c#:int        //c++:UINT8 * ---- c#:ref byte //C#中调用前需定义byte 变量名 = new byte();           //c++:handle ---- c#:IntPtr   //c++:hwnd ---- c#:IntPtr            //c++:void * ---- c#:IntPtr     //c++:void * user_obj_param ---- c#:IntPtr user_obj_param   //c++:void * 对象名称 ---- c#:([MarshalAs(UnmanagedType.AsAny)]Object 对象名称           //c++:char, INT8, SBYTE, CHAR ---- c#:System.SByte     //c++:short, short int, INT16, SHORT ---- c#:System.Int16     //c++:int, long, long int, INT32, LONG32, BOOL , INT ---- c#:System.Int32     //c++:__int64, INT64, LONGLONG ---- c#:System.Int64     //c++:unsigned char, UINT8, UCHAR , BYTE ---- c#:System.Byte     //c++:unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t ---- c#:System.UInt16     //c++:unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT ---- c#:System.UInt32     //c++:unsigned __int64, UINT64, DWORDLONG, ULONGLONG ---- c#:System.UInt64     //c++:float, FLOAT ---- c#:System.Single     //c++:double, long double, DOUBLE ---- c#:System.Double        //Win32 Types ---- CLR Type             //Struct需要在C#里重新定义一个Struct   //CallBack回调函数需要封装在一个委托里,delegate static extern int FunCallBack(string str);      //unsigned char** ppImage替换成IntPtr ppImage   //int& nWidth替换成ref int nWidth   //int*, int&, 则都可用 ref int 对应   //双针指类型参数,可以用 ref IntPtr   //函数指针使用c++: typedef double (*fun_type1)(double); 对应 c#:public delegate double fun_type1(double);   //char* 的操作c++: char*; 对应 c#:StringBuilder;   //c#中使用指针:在需要使用指针的地方 加 unsafe      //unsigned char对应public byte   /*   * typedef void (*CALLBACKFUN1W)(wchar_t*, void* pArg);   * typedef void (*CALLBACKFUN1A)(char*, void* pArg);   * bool BIOPRINT_SENSOR_API dllFun1(CALLBACKFUN1 pCallbackFun1, void* pArg);   * 调用方式为   * [UnmanagedFunctionPointer(CallingConvention.Cdecl)]   * public delegate void CallbackFunc1([MarshalAs(UnmanagedType.LPWStr)] StringBuilder strName, IntPtr pArg);   *   */

以上为个人经验,希望能给大家一个参考

标签:char,string,C#,System,c++,----,c#,C++,变量名
From: https://www.cnblogs.com/dhcpclass/p/17608061.html

相关文章

  • 深入探讨代理技术:从Socks5、SK5到IP代理
    代理技术简介代理技术是一种允许用户间接访问网络资源的中间人。用户通过代理服务器与目标服务器进行通信,目标服务器只能看到代理服务器的IP地址,而无法获知真正请求的客户端。代理技术在隐私保护、访问控制和负载均衡等方面发挥着重要作用。Socks5代理Socks5代理是一种网络传输协......
  • VxeTable 列动态数据过滤 FilterContent
    1、加入组件,并注册:下载官网实例将VxeTable的v4下的位置中的画框的几个都拷到自己的项目中,然后打开filter.tsx,将组件的引用路径调整自己的项目一致,如果是一样就不改了。这一步,要保证filter.tsx中引用到4个vue文件就可以。  2、引入到项目中,保证项目能读到filter.tsx,这样就......
  • 【腾讯云 Cloud Studio 实战训练营】一个多年云端开发体验者的实战使用
    背景近几年,越来越感觉软件的趋势逐渐从客户端越来越转向以web提供服务的云端,特别是互联网行业,典型的比如原型设计产品,从客户端软件Axure逐渐到墨刀在线原型设计的流行,UI设计行业photoshop&sketch转向蓝湖&MasterGo在线UI设计,web的力量前所未有的强大,可以说一个浏览器就能满足......
  • Practice on Codeforces and Atcoder in August
    EducationalCodeforcesRound151A~ECodeforcesRound#879Div.2CodeforcesRound#882Div.2CodeforcesRound#873Div.2......
  • Android开发 Jetpack Compose 与xml的混合开发AndroidView
    前言  JetpackCompose虽然已经逐渐完善,但是其实还是有很多地方未满足需求。比如播放视频、相机预览等等依然需要原来的View。所以目前阶段JetpackCompose与xml的混合开发非常重要。  官方文档地址:https://developer.android.google.cn/jetpack/compose/migrate/interopera......
  • vscode 运行Rust cargo test时显示log输出
    使用以下tasks.json对于log库的输出(info,debug,warn...)需要在test方法上一行加#[test_log::test](来自test-loghttps://crates.io/crates/test-log){"version":"2.0.0","tasks":[{"type":"shell&quo......
  • java中ConcurrentHashMap底层原理 - 面试宝典
    ConcurrentHashMap是Java中的线程安全的哈希表实现。它通过使用分段锁(Segment)来实现并发访问的高效率。下面是ConcurrentHashMap的底层原理:数据结构:ConcurrentHashMap内部由一个Segment数组和若干个哈希桶(HashEntry)组成。每个Segment包含一个哈希桶数组和一个共享的锁。每个哈希桶......
  • PLC、DCS、SCADA系统通过OPC智能网关与云平台实时通讯
    OPC作为一种工业控制领域常用的标准通信规约,如PLC、DCS、SCADA等工业自动化系统大多提供了基于OPC规约的数据访问接口,通过OPC智能网关即可采集自动化设备系统数据并将数据传输至云端,打通工业系统数据孤岛,实现数据的互联互通,利用云端大数据平台对数据进行智能化运营。物通博联推出的......
  • ASPICE标准
    ASPICE(AutomotiveSoftwareProcessImprovementandCapabilityDetermination)是一种针对汽车软件开发过程的标准,旨在提高软件开发质量、安全性和效率。以下是ASPICE标准的详细说明:概述:ASPICE标准定义了一个层次结构,包括五个级别,从最低的Level0到最高的Level5。每个级别都有......
  • 环境温度变化对DC电源模块稳定性的影响
    环境温度变化对DC电源模块稳定性的影响BOSHIDADC电源模块是一种将交流电输入转化为稳定直流电输出的设备,其输出电压稳定性是非常重要的指标之一。在使用过程中,环境温度的变化可能会对其稳定性造成影响,因此需要对其进行充分的了解。 首先,环境温度的变化可能会对DC电源模块的......