欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > c# MetroForm 和 IntPtr unsafe

c# MetroForm 和 IntPtr unsafe

2025/2/27 12:06:14 来源:https://blog.csdn.net/weixin_39354845/article/details/140841229  浏览:    关键词:c# MetroForm 和 IntPtr unsafe

一、NuGet安装框架

修改代码

效果:

 

结果:

 TopLevel与TopMost属性

            frm.TopLevel = false;  //Form.TopLevel 获取或设置一个值,该值指示是否将窗体显示为顶级窗口。frm.TopMost = false;  //Form.TopMost 获取或设置一个值,指示该窗体是否应显示为最顶层窗体。  TopMost是级别更高的属性

二、Marshal

三、IntPtr

C#【高级篇】 IntPtr是什么?怎么用?-CSDN博客

intPtr类是intPointer的缩写。C#中用来取代指针,也可以说对指针进行封装。指向非托管内存。它也不常用,因为C#项目中指针都被弃用了,那指针的封装——句柄,自然也被弃用了

IntPtr类型对多线程操作是安    IntPtr其实就是 HANDLE,无类型的指针。无类型的指针不能直接使用,需要传给接受它的函数。

IntPtr a = new IntPtr(2121);

int类型与IntPtr类型之间的转换

 int _value1 = 10;int _value2 = 20;//  AllocHGlobal 通过使用指定的字节数从进程的非托管中分配内存IntPtr _ptr1 = Marshal.AllocHGlobal(sizeof(int));IntPtr _ptr2= Marshal.AllocHGlobal(sizeof(int));// 将32位有符号整数写入非托管内存Marshal.WriteInt32(_ptr1, _value1);Marshal.WriteInt32(_ptr2, _value2);int  _nv1=Marshal.ReadInt32(_ptr1);int _nv2=Marshal.ReadInt32(_ptr2);Marshal.FreeHGlobal(_ptr1);   // 释放非托管内存中Marshal.FreeHGlobal(_ptr2);Console.WriteLine();

string类型与IntPtr之间的转换

            string _str = "aa";IntPtr _strPtr = Marshal.StringToHGlobalAnsi(_str);//  将非托管ANSI 字符串复制托管string _s = Marshal.PtrToStringAnsi(_strPtr);Marshal.FreeHGlobal(_strPtr);

结构体与IntPtr之间的转换

// 结构体stuInfo _stu = new stuInfo(){_name = "sam",_gender = "male",_age = 23,_hight=34,};// 拿到大小int  _size=Marshal.SizeOf(_stu);IntPtr _p1=Marshal.AllocHGlobal(_size);// 这一步很重要Marshal.StructureToPtr(_stu,_p1,true);stuInfo _stu2 = (stuInfo)Marshal.PtrToStructure(_p1,typeof(stuInfo));Console.WriteLine(_stu2._name);Console.WriteLine(_stu2._gender);Console.WriteLine(_stu2._age);Console.WriteLine(_stu2._hight);

 获得数组的指针

            int[] _ary = new int[] { 1, 2, 3 };IntPtr inp = Marshal.UnsafeAddrOfPinnedArrayElement(_ary, 0);IntPtr inp1 = Marshal.UnsafeAddrOfPinnedArrayElement(_ary, 1);IntPtr inp2 = Marshal.UnsafeAddrOfPinnedArrayElement(_ary, 2);//内存地址以字节为单位,第一个元素地址为:n,第二个为:n+数据类型的字节数。int32是4个字节,那么元素相邻址之间差4//每次运行结果的内存地址都不一样!!!但地址却都相差4【系统随机分配内存】Console.WriteLine(inp.ToString());//输出的就是一串数字,就是内存地址。输出结果:nConsole.WriteLine(inp1.ToString());//输出的就是一串数字,就是内存地址。输出结果:n+4Console.WriteLine(inp2.ToString());//输出的就是一串数字,就是内存地址。输出结果:n+8

获取某个变量的指针

unsafe

这里就要用到C#中的指针,用unsafe {}关键字,并设置:项目属性——>生成——>勾选“允许不安全代码”

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词