Marshal在C#中的应用(void *指针到IntPtr的转化)

本文探讨了在C#中如何处理C语言API中的void *指针,特别是将其转化为IntPtr的过程。通过示例解释了简单转化和复杂情况下的转化策略,包括结构体成员和内存分配问题。了解这些原理对于正确调用C库至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  C#调用C语言的API时一般把void *指针转换成IntPtr,但这经常远远不够的。在C语言中void *是个万金油,尤其是一些老的c语言程序,所有的参数就一个void*指针,里面包罗万象,然后在程序中来一个switch,甚至多个switch来处理不同的参数。最近笔者就碰到了这个问题,不得不来研究一下怎么把void *指针转换成IntPtr。

1.void *指针到IntPtr的简单转化。

c语言函数原型:

int SetConfig(int type, void *p);

这里假设p的所传递的参数式是结构体A:

struct A			
{
	wchar_t osdbuffer[100];				
	unsigned short ix;						
	unsigned short iy;						
};

 那么在C#中原型可以定义如下:

int SetConfig(int type, IntPtr p);

结构体A 

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
		public struct A {
			[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
			public string osdbuffer;		
			public ushort ix;						//显示坐标x
			public ushort iy;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值