解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
5.25 KiB
X
# MachineInfo ʹÓÃÊÖ²á ## ¸ÅÊö `MachineInfo` Ìṩ¿çƽ̨£¨Windows / Linux / macOS / Xamarin£©µÄÒ»×é»úÆ÷/ÔËÐÐʱÐÅÏ¢²É¼¯·½·¨£¬°üº¬¾²Ì¬Ó²¼þ/ϵͳ±êʶÒÔ¼°ÔËÐÐʱָ±ê£¨ÄÚ´æ¡¢CPU¡¢ÍøÂçËÙÂÊ¡¢Î¶ȡ¢µç³ØµÈ£©¡£ÀàʵÏÖÁË `IExtend`£¬²¢Ö§³Öͨ¹ý `IMachineInfo` À©Õ¹¶¨ÖÆÐÐΪ¡£ ¸ÃÀàÉè¼ÆÎªµ¥ÀýʹÓ㬻ñÈ¡³É±¾½Ï¸ß£¨»á·ÃÎÊÎļþϵͳ¡¢Ö´ÐÐϵͳÃüÁî»ò¶ÁÈ¡²Ù×÷ϵͳ API£©£¬½¨Òéͨ¹ý `MachineInfo.RegisterAsync()` ÔÚÓ¦ÓÃÆô¶¯Ê±³õʼ»¯Ò»´Î²¢¸´Óᣠ## ¿ìËÙÈëÃÅ - ×¢²á²¢»ñÈ¡µ¥Àý£º ```c# var mi = await MachineInfo.RegisterAsync(); // »òÕß×èÈû»ñÈ¡ var current = MachineInfo.GetCurrent(); ``` - ´Ó¶ÔÏóÈÝÆ÷½âÎö£¨Èç¹ûÒÑ×¢²á£©£º ```C# var mi = MachineInfo.Resolve(); ``` - ÊÖ¶¯Ë¢ÐÂÔËÐÐʱÊý¾Ý£º ```C# mi.Refresh(); ``` ## Ö÷ÒªÊôÐÔ£¨ÕªÒª£© - `OSName`£º²Ù×÷ϵͳÃû³Æ¡£ - `OSVersion`£º²Ù×÷ϵͳ°æ±¾×Ö·û´®¡£ - `Product`£º²úÆ·/»úÆ÷Ðͺţ¨ÈçÔÆ³§É̲úÆ·Ãû¡¢±Ê¼Ç±¾Ðͺŵȣ©¡£ - `Vendor`£ºÖÆÔìÉÌ£¨Èç Dell¡¢Apple¡¢Tencent µÈ£©¡£ - `Processor`£º´¦ÀíÆ÷ÐͺÅÃèÊö×Ö·û´®¡£ - `UUID`£ºÓ²¼þΨһ±êʶ£¨Í¨³£À´×ÔÖ÷°å»ò DMI£©¡£ - `Guid`£ºÈí¼þ/ϵͳΨһ±êʶ£¨Windows MachineGuid¡¢Linux machine-id¡¢Android android_id µÈ£©¡£ - `Serial`£º¼ÆËã»úÐòÁкţ¨Æ·ÅÆ»úÏÔʾµÄÐòÁкţ©¡£ - `Board`£ºÖ÷°åÐòÁкŻò¼Ò×åÐÅÏ¢¡£ - `DiskID`£º´ÅÅÌÐòÁкŻò´ÅÅ̱êʶÁÐ±í£¨¶ººÅ·Ö¸ô£©¡£ - `Memory`£º×ÜÎïÀíÄڴ棨×Ö½Ú£©¡£ - `AvailableMemory`£º¿ÉÓÃÎïÀíÄڴ棨×Ö½Ú£©£¬Linux ÓÅÏÈʹÓà MemAvailable£¬Windows ʹÓà GlobalMemoryStatusEx.ullAvailPhys¡£ - `FreeMemory`£º¿ÕÏÐÄڴ棨×Ö½Ú£©£¬Linux ²ÉÓà free ÃüÁî¿Ú¾¶ÈÚºÏ Buffers/Cached/SReclaimable µÈ¡£ - `CpuRate`£ºCPU Õ¼ÓÃÂÊ£¨0~1£©¡£ - `UplinkSpeed` / `DownlinkSpeed`£ºÍøÂçÉÏÐÐ/ÏÂÐÐËÙÂÊ£¬µ¥Î»×Ö½Ú/Ã루Ê״ζÁȡΪ0£¬ÐèÒªÁ½´Î²ÉÑù²ÅÄܼÆË㣩¡£ - `Temperature`£ºÎ¶ȣ¨ÉãÊ϶ȣ©¡£ - `Battery`£ºµç³ØÊ£ÓࣨСÓÚ1 µÄСÊý£¬Èç 0.8 ±íʾ 80%£©¡£ ÁíÍ⣬`MachineInfo` ʵÏÖ `IExtend`£¬¿Éͨ¹ýË÷ÒýÆ÷±£´æ/¶ÁÈ¡À©Õ¹¼üÖµ£º ```C# mi["CustomKey"] = "Value"; var v = mi["CustomKey"]; ``` ## ¾²Ì¬·½·¨Ó븨Öú - `MachineInfo.RegisterAsync()`£ºÒì²½³õʼ»¯²¢×¢²áµ¥ÀýʵÀý£¬ÄÚ²¿»á³¢ÊÔ´Ó»º´æÎļþ£¨`Path.GetTempPath()/machine_info.json` »ò DataPath£©¶ÁÈ¡ÀúÊ·ÐÅÏ¢ÒÔ¼ÓËÙ³õʼ»¯¡£ - `MachineInfo.GetCurrent()`£ºÍ¬²½»ñÈ¡µ±Ç°µ¥Àý£¨Èç¹ûδ³õʼ»¯»á×èÈûµÈ´ý `RegisterAsync()` ½á¹û£©¡£ - `MachineInfo.Resolve()`£º´Ó¶ÔÏóÈÝÆ÷½âÎöÒÑ×¢²áʵÀý£¨ÈôÒÑ×¢²á£©¡£ - `MachineInfo.GetFreeSpace(string? path = null)`£º»ñȡָ¶¨Â·¾¶ËùÔÚÅÌ·ûµÄ¿ÉÓÿռ䣨×Ö½Ú£©£¬Ê§°Ü·µ»Ø `-1`¡£ - `MachineInfo.GetFiles(string path, bool trimSuffix = false)`£ºÃ¶¾ÙĿ¼ÏÂÎļþÃû²¢·µ»ØÃû³ÆÁÐ±í£¨ÓÃÓÚ¶ÁÈ¡ `/dev/disk` µÈ£©¡£ - `MachineInfo.IsInContainer`£ºÅжÏÊÇ·ñÔËÐÐÔÚÈÝÆ÷»·¾³£¨ÒÀ¾Ý»·¾³±äÁ¿¡¢/.dockerenv »ò /proc/1/cgroup ÄÚÈÝ£©¡£ - `MachineInfo.GetContainerLimits()`£ºÔÚ Linux É϶ÁÈ¡ cgroup v1/v2 µÄÄÚ´æÓë CPU Åä¶îÏÞÖÆ£¬·µ»Ø `(MemoryLimit, CpuLimit)`¡£ - `MachineInfo.GetContainerMemoryUsage()`£º¶ÁÈ¡ÈÝÆ÷µ±Ç°ÄÚ´æÊ¹Óã¨×Ö½Ú£©£¬ÓÅÏȳ¢ÊÔ cgroup v2£¨memory.current£©¡£ ## À©Õ¹Óë¶¨ÖÆ - ×Ô¶¨ÒåÌṩÕߣºÊµÏÖ `IMachineInfo`£¬²¢ÔÚÓ¦ÓÃÆô¶¯Ê±ÉèÖà `MachineInfo.Provider`¡£ ```C# public class MyProvider : IMachineInfo { public void Init(MachineInfo info) { /* ³õʼ»¯¾²Ì¬×Ö¶Î */ } public void Refresh(MachineInfo info) { /* Ë¢ÐÂÔËÐÐʱ×Ö¶Î */ } } MachineInfo.Provider = new MyProvider(); ``` ´Ë»úÖÆÔÊÐíÔÚ²»Í¬Æ½Ì¨»òÔËÐл·¾³ÖÐÐÞ¸Ä×ֶβɼ¯Âß¼­»ò²¹³ä¶îÍâÐÅÏ¢¡£ ## ƽ̨ÐÐΪ²îÒì - Windows£ºÓÅÏÈ´Ó×¢²á±í¶ÁÈ¡ `MachineGuid`¡¢DMI Óë BIOS ÐÅÏ¢£»Ê¹Óà `GlobalMemoryStatusEx` »ñÈ¡Äڴ棻²¿·ÖÐÅϢͨ¹ý WMIC »ò WMI »ñÈ¡£¨¶Ô .NET Framework Ìṩ¸ü·á¸»Ö§³Ö£©¡£ - Linux£º¶ÁÈ¡ `/proc`¡¢`/sys/class/dmi`¡¢`/etc/*-release`¡¢`/etc/machine-id` µÈÎļþÀ´Ìî³äÐÅÏ¢£»CPU ÓëÄÚ´æÖ¸±êÀ´×Ô `/proc/stat` Óë `/proc/meminfo`£»Î¶ÈÀ´×Ô `/sys/class/thermal` »ò hwmon µÈ¡£ - macOS£ºÍ¨¹ý `sw_vers`¡¢`system_profiler`¡¢`diskutil` µÈÃüÁî¶ÁÈ¡ÐÅÏ¢¡£ - Xamarin/Mono£º³¢ÊÔ´Ó `Android.OS.Build`¡¢`Xamarin.Essentials` µÈ¶ÁÈ¡É豸ÐÅÏ¢Óëµç³Ø×´Ì¬¡£ ## ʹÓý¨ÒéÓë×¢ÒâÊÂÏî - µ¥Àýģʽ£ºÓÉÓڲɼ¯³É±¾½Ï¸ß£¬½¨ÒéÔÚÓ¦ÓÃÆô¶¯½×¶Îµ÷Óà `RegisterAsync()` ²¢¸´Óà `MachineInfo.Current`¡£ - Ë¢ÐÂÆµÂÊ£º`Refresh()` »á¶ÁȡϵͳÎļþÓëÖ´ÐÐÃüÁӦ±ÜÃâ¸ßƵµ÷Óã¨ÀýÈçÿÃë¶à´Î£©¡£ÍøÂçËٶȲâÁ¿ÐèÒªÁ½´Î²ÉÑù¼ä¸ô£¬½¨ÒéÖÁÉÙ¼ä¸ô 1 ÃëÒÔÉÏ¡£ - ¿É¼ûÐÔÓëÇåÏ´£ºÀà»á×Ô¶¯²Ã¼ô²»¿É¼û×Ö·û²¢Ìî³äĬÈÏÖµ£¨ÈôÎÞ·¨¶ÁÈ¡ Guid/UUID£¬»áÉú³ÉÒÔ `0-` ǰ׺µÄËæ»ú GUID ²¢½èÖúÎļþ»º´æÎ¬³ÖÎȶ¨£©¡£ - ȨÏÞ£º²¿·Ö¶ÁÈ¡²Ù×÷ÐèÒª½Ï¸ßȨÏÞ£¨ÀýÈç¶ÁȡijЩ `/sys` »ò WMI£©£¬ÔÚÈÝÆ÷»òÊÜÏÞ»·¾³Ï¿ÉÄÜÎÞ·¨»ñÈ¡ËùÓÐÐÅÏ¢¡£ - ¿É¿¿ÐÔ£º·½·¨ÄÚ²¿²¶»ñÒì³£²¢ÔÚµ÷ÊÔ¼¶±ð¼Ç¼£¬Í¨³£²»»áÅ׳öÒì³££¬µ«»ñÈ¡²»µ½µÄ×ֶλᱣ³Ö¿Õ»òĬÈÏÖµ¡£ ## ʾÀý ```csharp // Æô¶¯Ê±×¢²á await MachineInfo.RegisterAsync(); var mi = MachineInfo.Current; Console.WriteLine($"OS: {mi.OSName} {mi.OSVersion}"); Console.WriteLine($"CPU: {mi.Processor}"); Console.WriteLine($"Memory: {mi.Memory / 1024 / 1024} MB"); // ¶¨Ê±Ë¢ÐÂ¼à¿ØÖ¸±ê var timer = new System.Threading.Timer(_ => { mi.Refresh(); Console.WriteLine($"CPU: {mi.CpuRate:P}, Up:{mi.UplinkSpeed}B/s, Down:{mi.DownlinkSpeed}B/s"); }, null, 0, 5000); ``` ## ³£¼ûÎÊÌâ - Q£ºÊ״ζÁÈ¡ÍøÂçËÙÂÊΪʲôΪ 0£¿ A£ºËÙ¶ÈʹÓÃÁ½´ÎÑù±¾²î¼ÆË㣬³õʼ»¯ºóÊ״ζÁȡûÓÐÀúÊ·Ñù±¾£¬½á¹ûΪ 0£¬ÏÂÒ»´Îˢкó»áµÃµ½ÓÐЧֵ¡£ - Q£ºÎªÊ²Ã´ÔÚÈÝÆ÷Öп´µ½µÄÄÚ´æ/CPU ÓëËÞÖ÷²»Í¬£¿ A£ºÈÝÆ÷ÔËÐÐʱ¿ÉÄܱ» cgroup ÏÞÖÆ£¬`GetContainerLimits()` ÒÔ¼° `GetContainerMemoryUsage()` ÄܶÁÈ¡ÕâЩÅä¶î¡£ - Q£ºÈçºÎÔÚµ¥Ôª²âÊÔÖÐÄ£Äâ MachineInfo£¿ A£ºÎª `MachineInfo.Provider` Ìṩһ¸ö²âÊÔʵÏÖ£¬»òÔÚ²âÊÔÖÐÖ±½Ó¹¹Ôì `MachineInfo` ²¢¸³ÖµÐèÒªµÄ×ֶΡ£ ## °æ±¾Óë¼æÈÝÐÔ - ¸ÃÀà¿ç¶à¸öÄ¿±ê¿ò¼Ü£¨°üÀ¨ .NET Framework¡¢.NET Core¡¢.NET 5+ Óë Mono£©Ê¹ÓÃÌõ¼þ±àÒë´¦ÀíÆ½Ì¨²îÒì¡£ ## ²Î¿¼ - ÀàÔ´Îļþ£º`NewLife.Core/Common/MachineInfo.cs` - ÎĵµÕ¾µã£ºhttps://newlifex.com/core/machine_info