解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# 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
|