10.2. Распространение вашего приложения

Источник здесь. [перевод не проверен];[Переводчик: Богданов Михаил][Исправил: Андрей Бушман (исправил перевод, удалил версию кода (перемешка строк из VBA и C#) и заменил на "родную" версию кода для обоих языков)]

    .NET приложения могут быть разделены на два вида сборок: отладочная сборка, и конечная сборка (release).
    Отладочная сборка – содержит отладочную информацию. .NET сборки с отладочной информацией больше по размеру, чем конечные сборки.
    Рабочая сборка – не содержит отладочной информации.

    Вы должны выбрать тип сборки, для распространения вашего приложения. Оба типа приложений могут быть загружены в AutoCAD. Отладочная сборка, как правило используется только при разработке и тестировании приложений. Рабочая сборка собираются для распространения и использования на нескольких компьютерах внутри или вне компании. 

Пошаговое создание конечной сборки под .NET:

  • В Microsoft Visual Studio откройте проект, из которого вы хотите создать финальную сборку.
  • Нажмите кнопку Построить меню Configuration Manager. 
  • В диспетчере конфигурации, конфигурации активного решения в раскрывающемся списке выберите релиз. 
  • Нажмите кнопку "Закрыть". 
  • В Microsoft Visual Studio, нажмите кнопку Построить меню Build Solution.
  • Загрузка сборки .NET 
    После того, как вы определили тип сборки вашего приложения NET. Вы должны определить способ его загрузки в AutoCad. NET сборка может быть загружена вручную или по требованию.

    Вручную - с помощью команды NETLOAD в командной строке или в файле AutoLISP. Для получения информации о загрузке. NET сборки командой NETLOAD см. загрузка NET сборки в AutoCAD.
    Загрузку по требованию определяет специфический ключ в приложении, которое вы хотите загрузить во время запуска AutoCAD. Ключ должен быть расположен после ключа приложения указывающего версию AutoCAD, в которую вы хотите загрузить своё приложение. 

    Раздел регистрируемого приложения может содержать в себе следующие ключи:

DESCRIPTION

    Описание .NET сборки не является обязательным.

LOADCTRLS

    Указывает, когда загружается .NET сборка:
1 - Приложение загружается при обнаружении прокси-объекта
2 - Загружать приложение при запуске
4 - Загружать приложение при запуске команды
8 – Загружать приложение по требованию пользователя или других приложений
16 - Не загружать приложение
32 - Загружать приложение прозрачно

LOADER

    Определяет, какие файлы NET сборки загружать.

MANAGED

    Указывает файл, который должен быть загруженной. NET сборкой или ObjectARX файл. Установить в 1 для файла NET сборки.

Требование для загрузки приложения .NET

    Следующие примеры создают и удаляют нужные ключи в реестре, чтобы загрузить сборку NET при запуске Autocad. Команда RegisterMyApp создает необходимые ключи реестра, чтобы приложение автоматически загрузились при следующей загрузке Autocad. Команда UnregisterMyApp удаляет данные из реестра так, что приложение перестает загружаться вместе с Autocad.

Код VB.NET

   1:  Imports Microsoft.Win32
   2:  Imports System.Reflection
   3:   
   4:  Imports Autodesk.AutoCAD.Runtime
   5:  Imports Autodesk.AutoCAD.ApplicationServices
   6:   
   7:  <CommandMethod("RegisterMyApp")> _
   8:  Public Sub RegisterMyApp()
   9:    '' Из реестра получаем ключ AutoCAD
  10:    Dim sProdKey As String = HostApplicationServices.Current.RegistryProductRootKey
  11:    Dim sAppName As String = "MyApp"
  12:   
  13:    Dim regAcadProdKey As RegistryKey = Registry.CurrentUser.OpenSubKey(sProdKey)
  14:    Dim regAcadAppKey As RegistryKey = regAcadProdKey.OpenSubKey("Applications", True)
  15:   
  16:    '' Проверяем, существует ли в ветке реестра раздел "MyApp"
  17:    Dim subKeys() As String = regAcadAppKey.GetSubKeyNames()
  18:    For Each sSubKey As String In subKeys
  19:        '' Если приложение уже зарегистрировано - завершаем работу
  20:        If (sSubKey.Equals(sAppName)) Then
  21:            regAcadAppKey.Close()
  22:   
  23:            Exit Sub
  24:        End If
  25:    Next
  26:   
  27:    '' Получаем строковое представление пути к каталогу, в котором находится текущий модуль
  28:    Dim sAssemblyPath As String = Assembly.GetExecutingAssembly().Location
  29:   
  30:    '' Регистрируем приложение
  31:    Dim regAppAddInKey As RegistryKey = regAcadAppKey.CreateSubKey(sAppName)
  32:    regAppAddInKey.SetValue("DESCRIPTION", sAppName, RegistryValueKind.String)
  33:    regAppAddInKey.SetValue("LOADCTRLS", 14, RegistryValueKind.DWord)
  34:    regAppAddInKey.SetValue("LOADER", sAssemblyPath, RegistryValueKind.String)
  35:    regAppAddInKey.SetValue("MANAGED", 1, RegistryValueKind.DWord)
  36:   
  37:    regAcadAppKey.Close()
  38:  End Sub
  39:   
  40:  <CommandMethod("UnregisterMyApp")> _
  41:  Public Sub UnregisterMyApp()
  42:    '' Из реестра получаем ключ AutoCAD
  43:    Dim sProdKey As String = HostApplicationServices.Current.RegistryProductRootKey
  44:    Dim sAppName As String = "MyApp"
  45:   
  46:    Dim regAcadProdKey As RegistryKey = Registry.CurrentUser.OpenSubKey(sProdKey)
  47:    Dim regAcadAppKey As RegistryKey = regAcadProdKey.OpenSubKey("Applications", True)
  48:   
  49:    '' Удаляем ключ приложения
  50:    regAcadAppKey.DeleteSubKeyTree(sAppName)
  51:    regAcadAppKey.Close()
  52:  End Sub

Код C#

   1:  using Microsoft.Win32;
   2:  using System.Reflection;
   3:   
   4:  using Autodesk.AutoCAD.Runtime;
   5:  using Autodesk.AutoCAD.ApplicationServices;
   6:   
   7:  [CommandMethod("RegisterMyApp")]
   8:  public void RegisterMyApp()
   9:  {
  10:    // Из реестра получаем ключ AutoCAD
  11:    string sProdKey = HostApplicationServices.Current.RegistryProductRootKey;
  12:    string sAppName = "MyApp";
  13:   
  14:    RegistryKey regAcadProdKey = Registry.CurrentUser.OpenSubKey(sProdKey);
  15:    RegistryKey regAcadAppKey = regAcadProdKey.OpenSubKey("Applications", true);
  16:   
  17:    // Проверяем, существует ли в ветке реестра раздел "MyApp"
  18:    string[] subKeys = regAcadAppKey.GetSubKeyNames();
  19:    foreach (string subKey in subKeys)
  20:    {
  21:        // Если приложение уже зарегистрировано - завершаем работу
  22:        if (subKey.Equals(sAppName))
  23:        {
  24:            regAcadAppKey.Close();
  25:            return;
  26:        }
  27:    }
  28:   
  29:    // Получаем строковое представление пути к каталогу, в котором находится текущий модуль
  30:    string sAssemblyPath = Assembly.GetExecutingAssembly().Location;
  31:   
  32:    // Регистрируем приложение
  33:    RegistryKey regAppAddInKey = regAcadAppKey.CreateSubKey(sAppName);
  34:    regAppAddInKey.SetValue("DESCRIPTION", sAppName, RegistryValueKind.String);
  35:    regAppAddInKey.SetValue("LOADCTRLS", 14, RegistryValueKind.DWord);
  36:    regAppAddInKey.SetValue("LOADER", sAssemblyPath, RegistryValueKind.String);
  37:    regAppAddInKey.SetValue("MANAGED", 1, RegistryValueKind.DWord);
  38:   
  39:    regAcadAppKey.Close();
  40:  }
  41:   
  42:  [CommandMethod("UnregisterMyApp")]
  43:  public void UnregisterMyApp()
  44:  {
  45:    // Из реестра получаем ключ AutoCAD
  46:    string sProdKey = HostApplicationServices.Current.RegistryProductRootKey;
  47:    string sAppName = "MyApp";
  48:   
  49:    RegistryKey regAcadProdKey = Registry.CurrentUser.OpenSubKey(sProdKey);
  50:    RegistryKey regAcadAppKey = regAcadProdKey.OpenSubKey("Applications", true);
  51:   
  52:    // Удаляем ключ приложения
  53:    regAcadAppKey.DeleteSubKeyTree(sAppName);
  54:    regAcadAppKey.Close();
  55:  }

Comments