using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace nisyscfg { public class NISyscfg { private bool isinit = false; private nint expertEnumHandle = 0; private nint sessionHandle = 0; private NISysCfgStatus status; public NISyscfg(string targetName="localhost", string username="", string password="",NISysCfgLocale language = NISysCfgLocale.NISysCfgLocaleDefault, bool forcePropertyRefresh = true, uint connectTimeoutMsec = 4000) { TargetName = targetName; UserName = username; Password = password; Language = language; ForcePropertyRefresh = forcePropertyRefresh; ConnectTimeoutMsec = connectTimeoutMsec; } public void Init() { if (isinit) return; status = NativeMethods.NISysCfgInitializeSession(TargetName, UserName, Password, Language, ForcePropertyRefresh, ConnectTimeoutMsec, ref expertEnumHandle, ref sessionHandle); if (status != NISysCfgStatus.NISysCfg_OK) return; Filter = NISysFilter.CreateFilter(sessionHandle); } public NISysFilter Filter { get; private set; } public List SearchHardware(NISysCfgFilterMode mode = NISysCfgFilterMode.NISysCfgFilterModeMatchValuesAll) { nint resourceEnumHandle = 0; NativeMethods.NISysCfgFindHardware(sessionHandle, mode, Filter.Handle, string.Empty, ref resourceEnumHandle); List hardwares = new List(); if (resourceEnumHandle == 0) return hardwares; nint h = 0; while(NativeMethods.NISysCfgNextResource(sessionHandle, resourceEnumHandle, ref h) == NISysCfgStatus.NISysCfg_OK) { hardwares.Add(new NIHardware(h)); } NativeMethods.NISysCfgCloseHandle(resourceEnumHandle); return hardwares; } public string TargetName { get; private set; } public string UserName { get; private set; } public string Password { get; private set; } public NISysCfgLocale Language { get; private set; } public bool ForcePropertyRefresh { get; private set; } public uint ConnectTimeoutMsec { get; private set; } public void Close() { NativeMethods.NISysCfgCloseHandle(sessionHandle); NativeMethods.NISysCfgCloseHandle(expertEnumHandle); if(Filter!=null) { NativeMethods.NISysCfgCloseHandle(Filter.Handle); } } } public class NIHardware:NISyscfgBase { [AttributeUsage(AttributeTargets.Property)] class HardwarePropertyAttribute:Attribute { public HardwarePropertyAttribute(NISysCfgResourceProperty property) { Property = property; } public NISysCfgResourceProperty Property { get; } } internal NIHardware(nint ptr):base(ptr) { typeof(NIHardware).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance) .Where(x => x.GetCustomAttribute() != null) .ToList() .ForEach(x => { var pro = x.GetCustomAttribute()?.Property; if (pro == null) return; if(x.PropertyType == typeof(bool)) { bool temp = false; NativeMethods.NISysCfgGetResourceProperty(ptr, pro.Value, ref temp); x.SetValue(this, temp); } else if(x.PropertyType == typeof(int) || x.PropertyType.IsEnum) { int temp = 0; NativeMethods.NISysCfgGetResourceProperty(ptr, pro.Value, ref temp); x.SetValue(this, temp); } else if(x.PropertyType == typeof(uint)) { uint temp = 0; NativeMethods.NISysCfgGetResourceProperty(ptr, pro.Value, ref temp); x.SetValue(this, temp); } else if(x.PropertyType == typeof(string)) { StringBuilder stringBuilder = new StringBuilder(1024); NativeMethods.NISysCfgGetResourceProperty(ptr, pro.Value, stringBuilder); x.SetValue(this, stringBuilder.ToString()); } else if (x.PropertyType == typeof(double)) { double temp = 0; NativeMethods.NISysCfgGetResourceProperty(ptr, pro.Value, ref Unsafe.As(ref temp)); x.SetValue(this, temp); } }); StringBuilder stringBuilder = new StringBuilder(1024); NativeMethods.NISysCfgGetResourceIndexedProperty(ptr, NISysCfgIndexedProperty.NISysCfgIndexedPropertyExpertName, 0, stringBuilder); ExpertName = stringBuilder.ToString(); stringBuilder = new StringBuilder(1024); NativeMethods.NISysCfgGetResourceIndexedProperty(ptr, NISysCfgIndexedProperty.NISysCfgIndexedPropertyExpertResourceName, 0, stringBuilder); ExpertResourceName = stringBuilder.ToString(); stringBuilder = new StringBuilder(1024); NativeMethods.NISysCfgGetResourceIndexedProperty(ptr, NISysCfgIndexedProperty.NISysCfgIndexedPropertyExpertUserAlias, 0, stringBuilder); ExpertUserAlias = stringBuilder.ToString(); } [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyIsDevice)] public bool IsDevice { get; private set; } [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyIsChassis)] public bool IsChassis { get; private set; } [HardwareProperty( NISysCfgResourceProperty.NISysCfgResourcePropertyConnectsToBusType)] public NISysCfgBusType ConnectsToBusType { get; private set; } [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyVendorId)] public uint VendorId { get; private set; } [HardwareProperty( NISysCfgResourceProperty.NISysCfgResourcePropertyVendorName)] public string VendorName { get; private set; } [HardwareProperty( NISysCfgResourceProperty.NISysCfgResourcePropertyProductId)] public uint ProductId { get; private set; } [HardwareProperty( NISysCfgResourceProperty.NISysCfgResourcePropertyProductName)] public string ProductName { get; private set; } [HardwareProperty( NISysCfgResourceProperty.NISysCfgResourcePropertySerialNumber)] public string SerialNumber { get; private set; } [HardwareProperty( NISysCfgResourceProperty.NISysCfgResourcePropertyFirmwareRevision)] public string FirmwareRevision { get; private set; } [HardwareProperty( NISysCfgResourceProperty.NISysCfgResourcePropertyIsNIProduct)] public bool IsNIProduct { get; private set; } [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyIsSimulated)] public bool IsSimulated { get; private set; } [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyConnectsToLinkName)] public string ConnectsToLinkName { get;private set; } [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyHasDriver)] public bool HasDriver { get; private set; } [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyIsPresent)] public bool IsPresent { get; private set; } [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertySlotNumber)] public int SlotNumber { get; private set; } [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertySupportsInternalCalibration)] public bool SupportsInternalCalibration { get; private set; } [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertySupportsExternalCalibration)] public bool SupportsExternalCalibration { get; private set; } [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyCurrentTemp)] public double CurrentTemp { get; private set; } [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyProvidesBusType)] public NISysCfgBusType ProvidesBusType { get; private set; } [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyProvidesLinkName)] public string ProvidesLinkName { get; private set; } [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyNumberOfSlots)] public int NumberOfSlots { get; private set; } [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyHardwareRevision)] public string HardwareRevision { get; private set; } public string ExpertName { get; private set; } public string ExpertUserAlias { get; private set; } public string ExpertResourceName { get; private set; } } public class NISysFilter:NISyscfgBase { private bool isDevice = false; private bool isChassis = false; private NISysCfgServiceType serviceType = NISysCfgServiceType.NISysCfgServiceTypemDnsNiSysapi; private NISysFilter(nint filterhandle):base(filterhandle) { } public static NISysFilter CreateFilter(nint session) { nint filter = 0; NativeMethods.NISysCfgCreateFilter(session, ref filter); return new NISysFilter(filter); } public bool IsDevice { get => isDevice; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyIsDevice, value); isDevice = value; } } public bool IsChassis { get => isChassis; set { NativeMethods.NISysCfgSetFilterProperty(handle,NISysCfgFilterProperty.NISysCfgFilterPropertyIsChassis, value); isChassis = value; } } public NISysCfgServiceType ServiceType { get => serviceType; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyServiceType, (int)value); serviceType = value; } } private NISysCfgBusType connBusType = NISysCfgBusType.NISysCfgBusTypeBuiltIn; public NISysCfgBusType ConnBusType { get => connBusType; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyConnectsToBusType, (int)value); connBusType = value; } } private string connectsToLinkName = ""; public string ConnectsToLinkName { get => connectsToLinkName; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyConnectsToLinkName, value); connectsToLinkName = value; } } private NISysCfgBusType providesBusType = NISysCfgBusType.NISysCfgBusTypeBuiltIn; public NISysCfgBusType ProvidesBusType { get => providesBusType; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyProvidesBusType, (int)value); providesBusType = value; } } private uint vendorId = 0; public uint VendorId { get => vendorId; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyVendorId, value); vendorId = value; } } private uint productId = 0; public uint ProductId { get => productId; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyProductId, value); productId = value; } } private string serialNumber = ""; public string SerialNumber { get => serialNumber; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertySerialNumber, value); serialNumber = value; } } private bool isNIProduct = false; public bool IsNIProduct { get => isNIProduct; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyIsNIProduct, value); isNIProduct = value; } } private bool isSimulated = false; public bool IsSimulated { get => isSimulated; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyIsSimulated, value); isSimulated = value; } } private int slotNumber = 0; public int SlotNumber { get => slotNumber; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertySlotNumber, value); slotNumber = value; } } private bool hasDriver = false; public bool HasDriver { get => hasDriver; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyHasDriver, value); hasDriver = value; } } private bool isPresent = false; public bool IsPresent { get => isPresent; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyIsPresent, value); isPresent = value; } } private bool supportsCalibration = false; public bool SupportsCalibration { get => supportsCalibration; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertySupportsCalibration, value); supportsCalibration = value; } } private bool supportsFirmwareUpdate = false; public bool SupportsFirmwareUpdate { get => supportsFirmwareUpdate; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertySupportsFirmwareUpdate, value); supportsFirmwareUpdate = value; } } private string providesLinkName = ""; public string ProvidesLinkName { get => providesLinkName; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyProvidesLinkName, value); providesLinkName = value; } } private string expertName = ""; public string ExpertName { get => expertName; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyExpertName, value); expertName = value; } } private string resourceName = ""; public string ResourceName { get => resourceName; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyResourceName, value); resourceName = value; } } public string UserAlias { get => userAlias; set { NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyUserAlias, value); userAlias = value; } } private string userAlias = ""; } public abstract class NISyscfgBase : IDisposable { internal nint Handle => handle; private protected nint handle = 0; public NISyscfgBase(nint ptr) { handle = ptr; } private bool disposedValue; protected virtual void Dispose(bool disposing) { if (!disposedValue) { if (disposing) { // TODO: 释放托管状态(托管对象) } NativeMethods.NISysCfgCloseHandle(handle); // TODO: 释放未托管的资源(未托管的对象)并重写终结器 // TODO: 将大型字段设置为 null disposedValue = true; } } // // TODO: 仅当“Dispose(bool disposing)”拥有用于释放未托管资源的代码时才替代终结器 // ~NISyscfgBase() // { // // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中 // Dispose(disposing: false); // } public void Dispose() { // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中 Dispose(disposing: true); GC.SuppressFinalize(this); } } }