C#调用C/C++动态库 封送结构体,结构体数组

本文详细介绍了C#如何调用C/C++动态库,涉及结构体和结构体数组的封送。讨论了通过传入结构体引用和 IntPtr 指针的方式,以及结构体数组的传递方法。还讨论了处理包含复杂结构体的输出参数的问题,强调了在处理过程中需要注意的内存管理和数据复制细节。
摘要由CSDN通过智能技术生成

因为实验室图像处理的算法都是在OpenCV下写的,还有就是导航的算法也是用C++写的,然后界面部分要求在C#下写,所以不管是Socket通信,还是调用OpenCV的DLL模块,都设计到了C#和C++数据类型的对应,还有结构体的封装使用。在夸语言调用方面,Java和C#都只能调用C格式导出的动态库,因为C数据类型比较单一,容易映射,两者都是在本地端提供一套与之映射的C#或者Java的描述接口,通过底层处理这种映射关系达到调用的目的。

 一. 结构体的传递

#define JNAAPI extern "C" __declspec(dllexport) // C方式导出函数 
   
typedef struct     
{   
    int osVersion;   
    int majorVersion;   
    int minorVersion;   
    int buildNum;   
    int platFormId;   
    char szVersion[128];   
}OSINFO;  

//获取版本信息(传递结构体指针)
JNAAPI bool SetVersionPtr(OSINFO *info)
{
	char * str = "Hello DLL";
	info->osVersion = 100;
	strcpy(info->szVersion, str);

	return true;
}
//获取版本信息(传递结构体引用)
JNAAPI bool SetVersionRef(OSINFO &info)
{
	char * str = "Hello DLL";
	info.osVersion = 101;
	strcpy(info.szVersion, str);

	return true;
}

  

在C#下对应的结构体定义:

// OSINFO定义  
[StructLayout(LayoutKind.Sequential)]  
public struct OSINFO  
{  
    public int osVersion;  
    public int majorVersion;  
    public int minorVersion;  
    public int buildNum;  
    public int platFormId;  
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]  
    public string szVersion;  
}  

  

可以通过两种方式来调用非托管的函数SetVersionPtr:

1. 方式一(传入结构体引用),在C#中&#

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值