c#调用C++DLL参数对应

c#调用非托管C++生成的dll  最近在项目中碰到需要调用非托管C++生成的dll,下面将自己遇到的问题,以及解决的办法总结如下:  1.     问题:     我们通常去映射dll的方法是使用        public const string dllPath =path;                [DllImport(dllPath + "test.dll", EntryPoint = "test()", Se 阅读详情

//C++中的DLL函数原型為
        //extern “C” __declspec(dllexport) bool 方法名一(const char* 变量名1, unsigned char* 变量名2)
        //extern “C” __declspec(dllexport) bool 方法名二(const unsigned char* 变量名1, char* 变量名2)
 

        //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++:char* 变量名[]  —– c#:string[] 或者通过List<string>.ToArray()
     
        //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
                //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);
         * 
         * 
         */

C# 调用Dll net平台上,调用dll文件有2种含义1、调用托管dll,即你使用。net平台开发的dll,属于托管代码2、调用非托管dll,即传统的dll,一般是C++,VB,DELPHI等等开发出来的,属于非托管代码。从你的意思中看出来你现在是调用托管的dll,方法是 “在解决方案管理器” - “解决方案”(或项目) 中的任意地方, 右键“添加引用”,“浏览”,选择你需要调用的dll文件... 阅读详情

相关推荐

C#调用C/C++编译生成的dll库

1 在C#中调用C/C++的动态链接库( .dll 文件)的一般格式 using System.Runtime.InteropServuces; //这是必须引用的命名空间(添加在文件中的其他using 下) 引用原型: [DllImport("user32.dll")] public static extern ReturnType FunctionName(t...

love_kevin的博客 1万+

MarshalAs的简单总结

作用: MarshalAs属性指示如何在托管代码和非托管代码之间封送数据。 使用方法: [MarshalAs(UnmanagedType unmanagedType, 命名参数)] 实际上相当于构造一个MarshalAsAttribute类的对象 常用的UnmanagedType枚举值:(详细内容查MSDN) BStr 长度前缀为双字节的 Unicode 字符串; LPStr 单字节、空终止的 ANSI 字符串。; LPWStr 一个 2 字节、空终止的 Unicode 字符串; ...

钢铁男儿 6676

c# 调用 C++ dll 传入传出参数对照表【C++ dll 类型与 C#类型对应关系】

C#调用 非托管C++ dll 传入Stringbuilder、ref string 、 ref char 等都报错,如mscorlib.dll 异常、其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏 等等,后来发现是dll 生成后一直没更新,放错位置了。。。 = =|| 不过也学习了一下编译器及类型相关的知识,整理如下: 1、 cl.exe /Gz 参数指定编译为 __stdcall 调用方式,默认为 __cdecl2、C#中的char是两个字节http://msdn.microsoft

dhl11的博客 2623

MarshalAs的使用

参考:http://blog.sina.com.cn/s/blog_4e4ee8ed0100elou.html 作用: MarshalAs属性指示如何在托管代码和非托管代码之间封送数据。 使用方法: [MarshalAs(UnmanagedType unmanagedType, 命名参数)] 实际上相当于构造一个MarshalAsAttribute类的对象 常用的Unmanaged

白永辉的专栏 2万+

c# 调用 C++ dll 传入传出 字符串

C#调用 非托管C++ dll 传入Stringbuilder、ref string 、 ref char 等都报错,如mscorlib.dll 异常、其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏 等等,后来发现是dll 生成后一直没更新,放错位置了。。。 = =|| 不过也学习了一下编译器及类型相关的知识,整理如下: 1、 cl.exe /Gz 参数指定编译为 __std...

小白的逆袭 1706

C#调用非托管C++DLL:直接调用法

在实际软件开发过程中,由于公司使用了多种语言开发,在C#中可能需要实现某个功能,而该功能可能用其他语言已经实现了,那么我们可以调用其他语言写好的模块吗?还有就是,由于C#开发好的项目,我们可以利用reflector等反编译工具反编译出其源代码,所以对于一些核心算法,我们不希望被别人知道,因此为了增强代码的安全性,我们需要将一些核心算法用C或C++来编写,然后用C#来调用这些已经写好的接口。在面对以...

菜鸟进阶 1819

c#调用c++ dll 参数对应

<br />c++ dll 中方法:<br />int __stdcall Comm_Send(const data_Head struHead, const wchar_t* pTLV, const int nCount)<br /> <br />c#调用:<br />[DllImport("xxx.dll", EntryPoint = "xxx", CharSet = CharSet.Auto)]<br />public static extern int Comm_Send(data_Head str

随便写写 1000

C#调用C++DLL

C#调用C++DLL出现错误 尝试读取或写入受保护的内存。 这个错误一般是因为调用接口函数时C#参数类型和C++参数类型不对应导致的。 C++DLL接口参数类型和C#对应参数类型对照表在网上很多。 //C++中的DLL函数原型为 //extern “C” __declspec(dllexport) bool 方法名一(const char* 变量名1, unsigned char* 变量名2) //extern “C” __declspec(dllexport) bool 方法名二(const unsi

qq_26049793的博客 751

C#与C++和C语言之间数据类型的对应

一、C#与C++数据类型的对应表 &nbsp; Windows Data Type .NET Data Type BOOL, BOOLEAN Boolean or Int32 BSTR String BYTE Byte CHAR Char DOUBLE Double DWORD Int32 or UInt32 FLOAT Sin...

woniuye的博客 4771

景区导览系统|景区展馆智能导览|小程序导览|电子导览手绘地图制作

AI 数字导游就像一位随时陪伴在游客身边的专属导游,能够根据游客的提问,迅速、准确地提供详细的景点介绍、历史文化知识讲解,甚至能根据游客的兴趣爱好和实时位置,为其智能规划个性化的游览路线。在手绘地图中可以显示景区中的景点信息、景点和景点之间的路径,也可以显示景区的关键地点信息:景区全景、植物景观、河流、道路、地形面貌、卫生间等公共设施~无论是景区还是展馆,道可云AI智能导览系统都能通过丰富的功能、先进的技术,为游客打造便捷、智能、个性化的游览体验,成为文旅行业数字化转型的得力助手。

道可云 1145

AI基础入门(大模型基础篇)——技术视角:你应该知道的LLM基础知识

本文从技术视角解析了大模型的工作原理,主要介绍了三个核心概念:Token、温度和Embedding。首先,大模型通过逐个添加Token来生成文本,Token数量直接影响上下文窗口大小和计费标准。其次,通过引入温度参数控制随机性,温度越高输出越多样化。最后,解释了字符串如何通过One-Hot编码和神经网络压缩转化为向量形式的Embedding,这是AI处理各类输入的基础。这些概念对理解大模型应用开发至关重要,Token决定处理能力,温度影响输出风格,Embedding则是信息转换的关键步骤。

小志的博客 1506

C#调用C/C++

C#调用C/C++前言DLL的生成C#控制台调用DLL以及平台问题遇到的一些坑 前言     最近做课程实践,用C#做可视化,C/C++来完成功能实现部分,记录下调用的简单步骤和一些坑。 DLL的生成     要使C/C++的代码能在C#中执行,需要先将C/C++的代码文件生成DLL文件,具体操作:     通过VS2019创建C++下的动态链接库项目   &nbsp

Mr_L_K的博客 4142

基于OSPF技术的某企业网络设计(完整文档+ENSP拓扑图)

主要对网络规划与设计,以企业网络为背景,对某个中型企业网络进行规划设计,该企业总部在南京,在常州有一个分公司,需要实现总部和分公司能够访问外网,能够让分公司内的用户或主机访问总部服务器的资源,并且保证数据的安全性。在这次总部企业网络设计中,考虑到资金的问题,核心层部署2台核心三层交换机,负责转发总部内部用户的流量,并充当内部用户网关,能够实现内部不同网段的用户之间的连通性。对于一些对网络比较敏感的企业或用户,对网络的要求较高,对于网络的稳定性和安全性也有较高的要求。

qq1325513482的博客 2万+

C#调用C++数据类型对应

C#调用C++数据类型对应cl.exe/Gz参数指定编译为`__stdcall`调用方式,默认为`__cdecl`C#中的`char`是两个字节C++==dll==类型与C#类型对应关系C#调用C++dll的几种传参方式原文链接 C#调用非托管C++的dll传入Stringbuilder、ref string、ref char等都报错,如mscorlib.dll异常、其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏 等等,后来发现是dll生成后一直没更新,放错位置了。。。 = =|| 不过也

天富儿的博客 3535

告别黑窗口!用VSCode+Native Debug调试C/C++程序,比GDB命令行舒服多了

本文介绍了如何使用VSCode配合Native Debug扩展来调试C/C++程序,替代传统的GDB命令行方式。通过可视化调试环境,开发者可以更高效地管理断点、查看变量和调用栈,大幅提升调试效率。文章详细讲解了环境配置、核心调试功能及高级技巧,帮助开发者快速上手这一现代调试工具。

weixin_26833139的博客 251

【深度学习】肺结节分割项目实战二:分割肺实质

在后续训练模型的时候如果直接使用原始的肺部CT图像,其中的非肺区域会对训练造成干扰,因此我们需要提取分割肺实质。这一部分参考了kaggle上的教程。 从这张CT图像中可以看出扫描器以外的部分为黑色,背景和肺内部颜色较深,非肺组织和骨头颜色较浅。我们的目的是将肺部分割出来。由于肺部区域和其他部分对比明显,我们可以设置一个合适的阈值对图像中的区域进行隔离。 import argparse import os import numpy as np from medpy.filter.smoothing imp

weixin_42182906的博客 7242

c++调用dll_C#调用C++动态库

Hello,大家好。今天来介绍一下C#如何调用C++动态库。文章会分两个部分进行讲解。C++如何编写一个动态库C#如何进行调用C++ 编写动态库1.创建一个C++动态链接库项目。2.声明方法下面分别举例了无入参和有入参的函数。其中有入参的函数列举了int、char* 、和结构体。#include "stdafx.h"using namespace std;#include//无参数ext...

weixin_39620037的博客 209

vcs 覆盖率收集1——三种覆盖率类型、covergroup、bins、数据采样、覆盖率选项

介绍各种覆盖率,以及如何编写覆盖率收集的代码

qq_42135020的博客 1万+
上一篇: 在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)
下一篇: C# Windows Sockets (Winsock) 接口 (转)
itffscut
博客等级 码龄15年 3粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值