NISyscfg.NET.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics.CodeAnalysis;
  4. using System.Linq;
  5. using System.Reflection;
  6. using System.Runtime.CompilerServices;
  7. using System.Runtime.InteropServices;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace nisyscfg
  11. {
  12. public class NISyscfg
  13. {
  14. private bool isinit = false;
  15. private nint expertEnumHandle = 0;
  16. private nint sessionHandle = 0;
  17. private NISysCfgStatus status;
  18. public NISyscfg(string targetName="localhost", string username="", string password="",NISysCfgLocale language = NISysCfgLocale.NISysCfgLocaleDefault, bool forcePropertyRefresh = true, uint connectTimeoutMsec = 4000)
  19. {
  20. TargetName = targetName;
  21. UserName = username;
  22. Password = password;
  23. Language = language;
  24. ForcePropertyRefresh = forcePropertyRefresh;
  25. ConnectTimeoutMsec = connectTimeoutMsec;
  26. }
  27. public void Init()
  28. {
  29. if (isinit) return;
  30. status = NativeMethods.NISysCfgInitializeSession(TargetName, UserName, Password, Language, ForcePropertyRefresh, ConnectTimeoutMsec, ref expertEnumHandle, ref sessionHandle);
  31. if (status != NISysCfgStatus.NISysCfg_OK) return;
  32. Filter = NISysFilter.CreateFilter(sessionHandle);
  33. }
  34. public NISysFilter Filter { get; private set; }
  35. public List<NIHardware> SearchHardware(NISysCfgFilterMode mode = NISysCfgFilterMode.NISysCfgFilterModeMatchValuesAll)
  36. {
  37. nint resourceEnumHandle = 0;
  38. NativeMethods.NISysCfgFindHardware(sessionHandle, mode, Filter.Handle, string.Empty, ref resourceEnumHandle);
  39. List<NIHardware> hardwares = new List<NIHardware>();
  40. if (resourceEnumHandle == 0) return hardwares;
  41. nint h = 0;
  42. while(NativeMethods.NISysCfgNextResource(sessionHandle, resourceEnumHandle, ref h) == NISysCfgStatus.NISysCfg_OK)
  43. {
  44. hardwares.Add(new NIHardware(h));
  45. }
  46. NativeMethods.NISysCfgCloseHandle(resourceEnumHandle);
  47. return hardwares;
  48. }
  49. public string TargetName { get; private set; }
  50. public string UserName { get; private set; }
  51. public string Password { get; private set; }
  52. public NISysCfgLocale Language { get; private set; }
  53. public bool ForcePropertyRefresh { get; private set; }
  54. public uint ConnectTimeoutMsec { get; private set; }
  55. public void Close()
  56. {
  57. NativeMethods.NISysCfgCloseHandle(sessionHandle);
  58. NativeMethods.NISysCfgCloseHandle(expertEnumHandle);
  59. if(Filter!=null)
  60. {
  61. NativeMethods.NISysCfgCloseHandle(Filter.Handle);
  62. }
  63. }
  64. }
  65. public class NIHardware:NISyscfgBase
  66. {
  67. [AttributeUsage(AttributeTargets.Property)]
  68. class HardwarePropertyAttribute:Attribute
  69. {
  70. public HardwarePropertyAttribute(NISysCfgResourceProperty property)
  71. {
  72. Property = property;
  73. }
  74. public NISysCfgResourceProperty Property { get; }
  75. }
  76. internal NIHardware(nint ptr):base(ptr)
  77. {
  78. typeof(NIHardware).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)
  79. .Where(x => x.GetCustomAttribute<HardwarePropertyAttribute>() != null)
  80. .ToList()
  81. .ForEach(x =>
  82. {
  83. var pro = x.GetCustomAttribute<HardwarePropertyAttribute>()?.Property;
  84. if (pro == null) return;
  85. if(x.PropertyType == typeof(bool))
  86. {
  87. bool temp = false;
  88. NativeMethods.NISysCfgGetResourceProperty(ptr, pro.Value, ref temp);
  89. x.SetValue(this, temp);
  90. }
  91. else if(x.PropertyType == typeof(int) || x.PropertyType.IsEnum)
  92. {
  93. int temp = 0;
  94. NativeMethods.NISysCfgGetResourceProperty(ptr, pro.Value, ref temp);
  95. x.SetValue(this, temp);
  96. }
  97. else if(x.PropertyType == typeof(uint))
  98. {
  99. uint temp = 0;
  100. NativeMethods.NISysCfgGetResourceProperty(ptr, pro.Value, ref temp);
  101. x.SetValue(this, temp);
  102. }
  103. else if(x.PropertyType == typeof(string))
  104. {
  105. StringBuilder stringBuilder = new StringBuilder(1024);
  106. NativeMethods.NISysCfgGetResourceProperty(ptr, pro.Value, stringBuilder);
  107. x.SetValue(this, stringBuilder.ToString());
  108. }
  109. else if (x.PropertyType == typeof(double))
  110. {
  111. double temp = 0;
  112. NativeMethods.NISysCfgGetResourceProperty(ptr, pro.Value, ref Unsafe.As<double,byte>(ref temp));
  113. x.SetValue(this, temp);
  114. }
  115. });
  116. StringBuilder stringBuilder = new StringBuilder(1024);
  117. NativeMethods.NISysCfgGetResourceIndexedProperty(ptr, NISysCfgIndexedProperty.NISysCfgIndexedPropertyExpertName, 0, stringBuilder);
  118. ExpertName = stringBuilder.ToString();
  119. stringBuilder = new StringBuilder(1024);
  120. NativeMethods.NISysCfgGetResourceIndexedProperty(ptr, NISysCfgIndexedProperty.NISysCfgIndexedPropertyExpertResourceName, 0, stringBuilder);
  121. ExpertResourceName = stringBuilder.ToString();
  122. stringBuilder = new StringBuilder(1024);
  123. NativeMethods.NISysCfgGetResourceIndexedProperty(ptr, NISysCfgIndexedProperty.NISysCfgIndexedPropertyExpertUserAlias, 0, stringBuilder);
  124. ExpertUserAlias = stringBuilder.ToString();
  125. }
  126. [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyIsDevice)]
  127. public bool IsDevice { get; private set; }
  128. [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyIsChassis)]
  129. public bool IsChassis { get; private set; }
  130. [HardwareProperty( NISysCfgResourceProperty.NISysCfgResourcePropertyConnectsToBusType)]
  131. public NISysCfgBusType ConnectsToBusType { get; private set; }
  132. [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyVendorId)]
  133. public uint VendorId { get; private set; }
  134. [HardwareProperty( NISysCfgResourceProperty.NISysCfgResourcePropertyVendorName)]
  135. public string VendorName { get; private set; }
  136. [HardwareProperty( NISysCfgResourceProperty.NISysCfgResourcePropertyProductId)]
  137. public uint ProductId { get; private set; }
  138. [HardwareProperty( NISysCfgResourceProperty.NISysCfgResourcePropertyProductName)]
  139. public string ProductName { get; private set; }
  140. [HardwareProperty( NISysCfgResourceProperty.NISysCfgResourcePropertySerialNumber)]
  141. public string SerialNumber { get; private set; }
  142. [HardwareProperty( NISysCfgResourceProperty.NISysCfgResourcePropertyFirmwareRevision)]
  143. public string FirmwareRevision { get; private set; }
  144. [HardwareProperty( NISysCfgResourceProperty.NISysCfgResourcePropertyIsNIProduct)]
  145. public bool IsNIProduct { get; private set; }
  146. [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyIsSimulated)]
  147. public bool IsSimulated { get; private set; }
  148. [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyConnectsToLinkName)]
  149. public string ConnectsToLinkName { get;private set; }
  150. [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyHasDriver)]
  151. public bool HasDriver { get; private set; }
  152. [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyIsPresent)]
  153. public bool IsPresent { get; private set; }
  154. [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertySlotNumber)]
  155. public int SlotNumber { get; private set; }
  156. [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertySupportsInternalCalibration)]
  157. public bool SupportsInternalCalibration { get; private set; }
  158. [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertySupportsExternalCalibration)]
  159. public bool SupportsExternalCalibration { get; private set; }
  160. [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyCurrentTemp)]
  161. public double CurrentTemp { get; private set; }
  162. [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyProvidesBusType)]
  163. public NISysCfgBusType ProvidesBusType { get; private set; }
  164. [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyProvidesLinkName)]
  165. public string ProvidesLinkName { get; private set; }
  166. [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyNumberOfSlots)]
  167. public int NumberOfSlots { get; private set; }
  168. [HardwareProperty(NISysCfgResourceProperty.NISysCfgResourcePropertyHardwareRevision)]
  169. public string HardwareRevision { get; private set; }
  170. public string ExpertName { get; private set; }
  171. public string ExpertUserAlias { get; private set; }
  172. public string ExpertResourceName { get; private set; }
  173. }
  174. public class NISysFilter:NISyscfgBase
  175. {
  176. private bool isDevice = false;
  177. private bool isChassis = false;
  178. private NISysCfgServiceType serviceType = NISysCfgServiceType.NISysCfgServiceTypemDnsNiSysapi;
  179. private NISysFilter(nint filterhandle):base(filterhandle)
  180. {
  181. }
  182. public static NISysFilter CreateFilter(nint session)
  183. {
  184. nint filter = 0;
  185. NativeMethods.NISysCfgCreateFilter(session, ref filter);
  186. return new NISysFilter(filter);
  187. }
  188. public bool IsDevice
  189. {
  190. get => isDevice;
  191. set
  192. {
  193. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyIsDevice, value);
  194. isDevice = value;
  195. }
  196. }
  197. public bool IsChassis
  198. {
  199. get => isChassis;
  200. set
  201. {
  202. NativeMethods.NISysCfgSetFilterProperty(handle,NISysCfgFilterProperty.NISysCfgFilterPropertyIsChassis, value);
  203. isChassis = value;
  204. }
  205. }
  206. public NISysCfgServiceType ServiceType
  207. {
  208. get => serviceType;
  209. set
  210. {
  211. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyServiceType, (int)value);
  212. serviceType = value;
  213. }
  214. }
  215. private NISysCfgBusType connBusType = NISysCfgBusType.NISysCfgBusTypeBuiltIn;
  216. public NISysCfgBusType ConnBusType
  217. {
  218. get => connBusType;
  219. set
  220. {
  221. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyConnectsToBusType, (int)value);
  222. connBusType = value;
  223. }
  224. }
  225. private string connectsToLinkName = "";
  226. public string ConnectsToLinkName
  227. {
  228. get => connectsToLinkName;
  229. set
  230. {
  231. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyConnectsToLinkName, value);
  232. connectsToLinkName = value;
  233. }
  234. }
  235. private NISysCfgBusType providesBusType = NISysCfgBusType.NISysCfgBusTypeBuiltIn;
  236. public NISysCfgBusType ProvidesBusType
  237. {
  238. get => providesBusType;
  239. set
  240. {
  241. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyProvidesBusType, (int)value);
  242. providesBusType = value;
  243. }
  244. }
  245. private uint vendorId = 0;
  246. public uint VendorId
  247. {
  248. get => vendorId;
  249. set
  250. {
  251. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyVendorId, value);
  252. vendorId = value;
  253. }
  254. }
  255. private uint productId = 0;
  256. public uint ProductId
  257. {
  258. get => productId;
  259. set
  260. {
  261. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyProductId, value);
  262. productId = value;
  263. }
  264. }
  265. private string serialNumber = "";
  266. public string SerialNumber
  267. {
  268. get => serialNumber;
  269. set
  270. {
  271. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertySerialNumber, value);
  272. serialNumber = value;
  273. }
  274. }
  275. private bool isNIProduct = false;
  276. public bool IsNIProduct
  277. {
  278. get => isNIProduct;
  279. set
  280. {
  281. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyIsNIProduct, value);
  282. isNIProduct = value;
  283. }
  284. }
  285. private bool isSimulated = false;
  286. public bool IsSimulated
  287. {
  288. get => isSimulated;
  289. set
  290. {
  291. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyIsSimulated, value);
  292. isSimulated = value;
  293. }
  294. }
  295. private int slotNumber = 0;
  296. public int SlotNumber
  297. {
  298. get => slotNumber;
  299. set
  300. {
  301. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertySlotNumber, value);
  302. slotNumber = value;
  303. }
  304. }
  305. private bool hasDriver = false;
  306. public bool HasDriver
  307. {
  308. get => hasDriver;
  309. set
  310. {
  311. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyHasDriver, value);
  312. hasDriver = value;
  313. }
  314. }
  315. private bool isPresent = false;
  316. public bool IsPresent
  317. {
  318. get => isPresent;
  319. set
  320. {
  321. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyIsPresent, value);
  322. isPresent = value;
  323. }
  324. }
  325. private bool supportsCalibration = false;
  326. public bool SupportsCalibration
  327. {
  328. get => supportsCalibration;
  329. set
  330. {
  331. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertySupportsCalibration, value);
  332. supportsCalibration = value;
  333. }
  334. }
  335. private bool supportsFirmwareUpdate = false;
  336. public bool SupportsFirmwareUpdate
  337. {
  338. get => supportsFirmwareUpdate;
  339. set
  340. {
  341. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertySupportsFirmwareUpdate, value);
  342. supportsFirmwareUpdate = value;
  343. }
  344. }
  345. private string providesLinkName = "";
  346. public string ProvidesLinkName
  347. {
  348. get => providesLinkName;
  349. set
  350. {
  351. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyProvidesLinkName, value);
  352. providesLinkName = value;
  353. }
  354. }
  355. private string expertName = "";
  356. public string ExpertName
  357. {
  358. get => expertName;
  359. set
  360. {
  361. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyExpertName, value);
  362. expertName = value;
  363. }
  364. }
  365. private string resourceName = "";
  366. public string ResourceName
  367. {
  368. get => resourceName;
  369. set
  370. {
  371. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyResourceName, value);
  372. resourceName = value;
  373. }
  374. }
  375. public string UserAlias
  376. {
  377. get => userAlias;
  378. set
  379. {
  380. NativeMethods.NISysCfgSetFilterProperty(handle, NISysCfgFilterProperty.NISysCfgFilterPropertyUserAlias, value);
  381. userAlias = value;
  382. }
  383. }
  384. private string userAlias = "";
  385. }
  386. public abstract class NISyscfgBase : IDisposable
  387. {
  388. internal nint Handle => handle;
  389. private protected nint handle = 0;
  390. public NISyscfgBase(nint ptr)
  391. {
  392. handle = ptr;
  393. }
  394. private bool disposedValue;
  395. protected virtual void Dispose(bool disposing)
  396. {
  397. if (!disposedValue)
  398. {
  399. if (disposing)
  400. {
  401. // TODO: 释放托管状态(托管对象)
  402. }
  403. NativeMethods.NISysCfgCloseHandle(handle);
  404. // TODO: 释放未托管的资源(未托管的对象)并重写终结器
  405. // TODO: 将大型字段设置为 null
  406. disposedValue = true;
  407. }
  408. }
  409. // // TODO: 仅当“Dispose(bool disposing)”拥有用于释放未托管资源的代码时才替代终结器
  410. // ~NISyscfgBase()
  411. // {
  412. // // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中
  413. // Dispose(disposing: false);
  414. // }
  415. public void Dispose()
  416. {
  417. // 不要更改此代码。请将清理代码放入“Dispose(bool disposing)”方法中
  418. Dispose(disposing: true);
  419. GC.SuppressFinalize(this);
  420. }
  421. }
  422. }