c# MetroForm 和 IntPtr unsafe

一、NuGet安装框架

修改代码

效果:

结果:

TopLevel与TopMost属性

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

二、Marshal

三、IntPtr

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

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

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

cpp 复制代码
IntPtr a = new IntPtr(2121);

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

cpp 复制代码
 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之间的转换

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

结构体与IntPtr之间的转换

cs 复制代码
            // 结构体

            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);

获得数组的指针

cs 复制代码
            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());//输出的就是一串数字,就是内存地址。输出结果:n
            Console.WriteLine(inp1.ToString());//输出的就是一串数字,就是内存地址。输出结果:n+4
            Console.WriteLine(inp2.ToString());//输出的就是一串数字,就是内存地址。输出结果:n+8

获取某个变量的指针

unsafe

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

相关推荐
hoiii1878 分钟前
CSTR反应器模型的Simulink-PID仿真(MATLAB实现)
开发语言·matlab
炘爚40 分钟前
C++ 右值引用与程序优化
开发语言·c++
si莉亚1 小时前
ROS2安装EVO工具包
linux·开发语言·c++·开源
清心歌1 小时前
CopyOnWriteArrayList 实现原理
java·开发语言
良木生香1 小时前
【C++初阶】C++入门相关知识(2):输入输出 & 缺省参数 & 函数重载
开发语言·c++
忘梓.1 小时前
墨色规则与血色节点:C++红黑树设计与实现探秘
java·开发语言·c++
hhh3u3u3u1 小时前
Visual C++ 6.0中文版安装包下载教程及win11安装教程
java·c语言·开发语言·c++·python·c#·vc-1
星河耀银海2 小时前
C++ 模板进阶:特化、萃取与可变参数模板
java·开发语言·c++
cccccc语言我来了2 小时前
【C++---unordered_set/map底层封装】个不拘一格的集合。它不似有序集合那般循规蹈矩,而是以一种洒脱不羁的方式,将元素们随意地散落其中。每一个元素都是独一无二的。
开发语言·c++·哈希算法
Zfox_2 小时前
C++ IO流全解析:标准库中的数据处理与文件读写艺术
开发语言·c++