千家信息网

如何使用c#的IntPtr

发表于:2024-10-24 作者:千家信息网编辑
千家信息网最后更新 2024年10月24日,本篇内容主要讲解"如何使用c#的IntPtr",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何使用c#的IntPtr"吧!ccalldll2.cpp中:i
千家信息网最后更新 2024年10月24日如何使用c#的IntPtr

本篇内容主要讲解"如何使用c#的IntPtr",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何使用c#的IntPtr"吧!

ccalldll2.cpp中:

int retstruct(user* u,int x,int y)
{
u->id += 10 + x;
u->age += 10 + y;
return 0;
}

在c#中:

[DllImport("ccalldll2.dll", EntryPoint = "retstruct",CallingConvention=CallingConvention.Cdecl)]
public static extern int retstruct(IntPtr ptrUser, int x, int y); //在引用中只引用了ccalldll2,而ccalldll2又用到了cSharpDLLforJNA,这样有问题吗
[StructLayout(LayoutKind.Sequential)]
struct user
{
public int id;
public int age;
};
private void btnInptr_Click(object sender, EventArgs e)
{
user u = new user();
u.id = 5;
u.age = 7;
//先要通过Marshal来分配内存空间,根据user的大小进行分配非托管空间大小
int size = Marshal.SizeOf(u);//对于值类型,可以Sizeof(变量),对于引用类型则Sizeof(typeof(TYPE))
IntPtr ptruser = Marshal.AllocHGlobal(size);//分配内存
//将u的值copy到ptruser空间
Marshal.StructureToPtr(u, ptruser, false);
int res = retstruct(ptruser, 5, 5);//调用DLL中函数 retstruct中将对ptruser指针所指的user中的id和age处理
user u2 = (user)Marshal.PtrToStructure(ptruser, typeof(user));//将处理之后的ptruser再转换为user
Console.WriteLine(u2.id + ":" + u2.age);
Console.WriteLine(res+":"+u.id+":"+u.age);
Marshal.FreeHGlobal(ptruser);
}

显示结果:

20:22
0:5:7

到此,相信大家对"如何使用c#的IntPtr"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0