Получение списка установленных версий AutoCAD

Дата публикации: 05 мая 2010
Состояние статьи: изменена 25.05.2012

    AcadInfo - класс, представляющий собой информацию о версии AutoCAD. Класс так же содержит статический метод GetInstalledAcads, позволяющий получить информацию обо всех установленных на локальной машине версиях AutoCAD. Результат работы метода упакован в коллекцию объектов AcadInfo. Метод IsCompatible сравнивает два объекта AcadInfo на предмет их совместимости - это требуется при анализировании плагинов AutoCAD. Перечисление Platform указывает целевую платформу.

AcadInfo

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using win = Microsoft.Win32;
   6:  using System.Text.RegularExpressions;
   7:  using System.Globalization;
   8:  using Microsoft.Win32;
   9:  using AndreyBushman;
  10:   
  11:  namespace AndreyBushman.AutoCAD {
  12:   
  13:      /// <summary>
  14:      /// Класс представляет собой некоторую информацию о версии AutoCAD.
  15:      /// </summary>
  16:      [Serializable]
  17:      public sealed class AcadInfo {
  18:   
  19:          /// <summary>
  20:          /// Конструктор класса
  21:          /// </summary>
  22:          /// <param name="major">Старшее число номера версии AutoCAD. Если в качестве значения указан Null - это 
  23:          /// означает, что подходит любой номер, кроме 0.</param>
  24:          /// <param name="minor">Младшее число номера версии AutoCAD Если в качестве значения указан Null - это 
  25:          /// означает, что подходит любое из следующих значений: 0, 1 или 2.</param>
  26:          /// <param name="platform">Разрядность операционной системы</param>
  27:          public AcadInfo(UInt16? major, UInt16? minor, Platform platform) {
  28:              Major = major;
  29:              Minor = minor;
  30:              Platform = platform;
  31:          }
  32:   
  33:          /// <summary>
  34:          /// Конструктор класса
  35:          /// </summary>
  36:          /// <param name="regKey">Ключ реестра, в котором хранится информация о конкретной версии AutoCAD</param>
  37:          public AcadInfo(RegistryKey regKey) {
  38:              String fullName = regKey.Name;
  39:              if (!IsValidAutoCADRegKey(fullName))
  40:                  throw new Exception(String.Format(Resources.InvalidRegKeyName, fullName));
  41:   
  42:              String parrentFullName = fullName.Split('\\')[4].Remove(0, 1);
  43:              String[] coreVersion = parrentFullName.Split('.');
  44:              Major = UInt16.Parse(coreVersion[0]);
  45:              Minor = UInt16.Parse(coreVersion[1]);
  46:              Platform = IntPtr.Size == 4 ? Platform.x86 : Platform.x64;
  47:              String xs = fullName.Substring(fullName.IndexOf(':') + 1);
  48:              Int32 xi = Int32.Parse(xs, NumberStyles.HexNumber);
  49:              CultureInfo = CultureInfo.GetCultureInfo(xi);
  50:              String valName = "Location";
  51:              if (IsExistsRegistryValue(regKey, valName))
  52:                  Location = regKey.GetValue(valName).ToString().Trim();
  53:              else
  54:                  throw new Exception(String.Format(Resources.NotExistsRegistryValue, regKey.Name, valName));
  55:              valName = "ProductName";
  56:              if (IsExistsRegistryValue(regKey, valName))
  57:                  ProductName = regKey.GetValue(valName).ToString().Trim();
  58:              else
  59:                  throw new Exception(String.Format(Resources.NotExistsRegistryValue, regKey.Name, valName));
  60:              registryName = fullName;
  61:          }
  62:   
  63:          /// <summary>
  64:          /// Получить все версии AutoCAD, установленные на текущем локальном компьютере.
  65:          /// </summary>
  66:          /// <returns>Возвращается массив объектов AcadInfo.</returns>
  67:          public static AcadInfo[] GetInstalledAcads() {
  68:              win.RegistryKey commonAcadKey = win.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Autodesk\AutoCAD", false);
  69:              if (commonAcadKey == null)
  70:                  return new AcadInfo[] { };
  71:              List<AcadInfo> result = new List<AcadInfo>();
  72:              String[] coreKeyNames = commonAcadKey.GetSubKeyNames().Where(n => Regex.IsMatch(n, @"^R[0-9]{2}\.[0-9]{1}$")).ToArray();
  73:              foreach (String item in coreKeyNames) {
  74:                  String[] x = item.Split('.');
  75:                  win.RegistryKey coreKey = commonAcadKey.OpenSubKey(item);
  76:                  string[] localizationKeys = coreKey.GetSubKeyNames().Where(n => Regex.IsMatch(n, @":[0-9]{1,3}$")).ToArray();
  77:                  foreach (String lang in localizationKeys) {
  78:                      RegistryKey rk = coreKey.OpenSubKey(lang);
  79:                      AcadInfo ai = new AcadInfo(rk);
  80:                      result.Add(ai);
  81:                  }
  82:              }
  83:              if (result.Count == 0)
  84:                  return null;
  85:              else
  86:                  return result.ToArray();
  87:          }
  88:   
  89:          /// <summary>
  90:          /// Метод проверяет параметр реестра на существование
  91:          /// </summary>
  92:          /// <param name="key">Ветка реестра, непосредственно в которой должен находиться искомый параметр</param>
  93:          /// <param name="valName">Имя проверяемого параметра</param>
  94:          /// <returns>Возвращается логический результат проверки</returns>
  95:          private static Boolean IsExistsRegistryValue(win.RegistryKey key, String valName) {
  96:              String[] names = key.GetValueNames();
  97:              Boolean result = false;
  98:              if (names.Contains(valName))
  99:                  result = !result;
 100:              return result;
 101:          }
 102:   
 103:          /// <summary>
 104:          /// Проверка на то, совместимы ли между собой сравниваемые объекты AcadInfo. Метод проверяет на идентичность свойства
 105:          /// Major, Minor и Platform. Если свойству Major и/или Minor присвоено значение 'null', то это означает, что 
 106:          /// значение данного свойства у сравниваемых объектов должно восприниматься как идентичное. В сравнении участвуют только 
 107:          /// версии ядра AutoCAD и разрядность целевой платформы.
 108:          /// </summary>
 109:          /// <param name="ai">объект, с которым производится сравнение</param>
 110:          /// <returns>Возвращается логический результат проверки.</returns>        
 111:          public Boolean IsCompatible(AcadInfo ai) {
 112:              return (((Platform & ai.Platform) != 0) || ((ai.Platform & Platform) != 0))
 113:                  && (Major == ai.Major || Major == null || ai.Major == null) &&
 114:                  (Minor == ai.Minor || Minor == null || ai.Minor == null);
 115:          }
 116:   
 117:          String productName;
 118:          /// <summary>
 119:          /// Наименование продукта
 120:          /// </summary>
 121:          public String ProductName {
 122:              get {
 123:                  return productName;
 124:              }
 125:              set {
 126:                  productName = value;
 127:              }
 128:          }
 129:          UInt16? major;
 130:          /// <summary>
 131:          /// Первое число, в номере версии ядра AutoCAD - то, которое расположено ДО точки. Значение 'null' указывает 
 132:          /// на то, что методом IsCompatible, свойство Major данного объекта должно восприниматься равным 
 133:          /// свойству Major любого другого объекта AcadInfo.
 134:          /// </summary>
 135:          public UInt16? Major {
 136:              get {
 137:                  return major;
 138:              }
 139:              set {
 140:                  if (value == 0)
 141:                      throw new Exception(Resources.InvalidMajorValue);
 142:                  major = value;
 143:              }
 144:          }
 145:          UInt16? minor;
 146:          /// <summary>
 147:          /// Второе число, в номере версии ядра AutoCAD - то, которое расположено ПОСЛЕ точки. Значение 'null' указывает 
 148:          /// на то, что методом IsCompatible, свойство Minor данного объекта должно восприниматься равным свойству 
 149:          /// Minor любого другого объекта AcadInfo.
 150:          /// </summary>
 151:          /// </summary>
 152:          public UInt16? Minor {
 153:              get {
 154:                  return minor;
 155:              }
 156:              set {
 157:                  UInt16?[] x = new UInt16?[] { null, 0, 1, 2 };
 158:                  if (!x.Contains(value))
 159:                      throw new Exception(Resources.InvalidMinorValue);
 160:                  minor = value;
 161:              }
 162:          }
 163:          String location;
 164:          /// <summary>
 165:          /// Каталог, в котором находится файл acad.exe
 166:          /// </summary>
 167:          public String Location {
 168:              get {
 169:                  return location;
 170:              }
 171:              set {
 172:                  location = value;
 173:              }
 174:          }
 175:          String registryName;
 176:          /// <summary>
 177:          /// Полное имя ветки реестра, в HKLM, хранящей в себе информацию о данной версии AutoCAD
 178:          /// </summary>
 179:          public String RegistryName {
 180:              get {
 181:                  return registryName;
 182:              }
 183:              set {
 184:                  if (IsValidAutoCADRegKey(value))
 185:                      registryName = value;
 186:                  else
 187:                      throw new Exception(String.Format(Resources.InvalidRegKeyName, value));
 188:              }
 189:          }
 190:   
 191:          /// <summary>
 192:          /// Проверка на то, находится ли указанная ветка реестра дочерней по отношению к ветке 
 193:          /// "HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD".
 194:          /// </summary>
 195:          /// <param name="value">Полное имя проверяемой ветки реестра</param>
 196:          /// <returns>Возвращается логический результат проверки</returns>
 197:          private static bool IsValidAutoCADRegKey(string value) {
 198:              return value.Trim().ToLower().StartsWith(@"hkey_local_machine\software\autodesk\autocad\");
 199:          }
 200:   
 201:          CultureInfo cultureInfo;
 202:          /// <summary>
 203:          /// Информация об используемой культуре
 204:          /// </summary>
 205:          public CultureInfo CultureInfo {
 206:              get {
 207:                  return cultureInfo;
 208:              }
 209:              set {
 210:                  cultureInfo = value;
 211:              }
 212:          }
 213:          Platform platform;
 214:          /// <summary>
 215:          /// Разрядность операционной системы
 216:          /// </summary>
 217:          public Platform Platform {
 218:              get {
 219:                  return platform;
 220:              }
 221:              set {
 222:                  platform = value;
 223:              }
 224:          }
 225:          /// <summary>
 226:          /// Метод возвращает строку, в которой указано наименование версии AutoCAD, его разрядность и локализация
 227:          /// </summary>
 228:          /// <returns>Строковое представление экземпляра</returns>
 229:          public override String ToString() {
 230:              String format = "{0} {1} ({2})";
 231:              return String.Format(format, ProductName, Platform, CultureInfo.DisplayName);
 232:          }
 233:      }
 234:  }

Platform

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:   
   6:  namespace AndreyBushman {
   7:      /// <summary>
   8:      /// Разрядность платформы
   9:      /// </summary>
  10:      [Flags]
  11:      public enum Platform {
  12:          /// <summary>
  13:          /// Платформа x86
  14:          /// </summary>
  15:          x86 = 1,
  16:          /// <summary>
  17:          /// Платформа x64
  18:          /// </summary>
  19:          x64 = 2,
  20:          /// <summary>
  21:          /// Любая (x86 или x64)
  22:          /// </summary>
  23:          Any = x86 | x64
  24:      }
  25:  }

Comments