3.5. Встроенные процессы против внешних

Источник здесь.[перевод не проверен];[перевёл Андрей Бушман]


    Когда вы разрабатываете новое приложение, оно может быть запущено внутри некоторого процесса (т.е. быть встроенным) или выполняться самостоятельно (т.е. быть внешним). AutoCAD .NET API ориентировано на разработку кода, предназначенного на использование его только внутри уже существующих процессов, в отличие от библиотек ActiveX, которые могут быть запущены как самостоятельно, так и в составе некоего уже запущенного процесса.
  • Встроенные приложения (dll-файлы) предназначены для запуска их в пространстве процесса, являющегося хостом для основного приложения.
  • Внешние приложения не запускаются в пространстве, являющемся хостом основного приложения. Такие приложения зачастую создаются в виде исполнимых файлов (exe-файлы). 
    Если вам нужно создать исполнимое приложение, для управления AutoCAD - реализовать это лучше всего посредством использования методов CreateObject и GetObject, создающих экземпляр приложения AutoCAD, или возвращающих ссылку на один из уже запущенных вами процессов данного приложения.Сохранив один раз полученную ссылку в экземпляре класса AcadApplication, вы затем можете пользоваться ею, загрузив в неё разработанное вами встроенное приложение посредством метода SendCommand, имеющегося у экземпляра класса ActiveDocument и являющегося, в свою очередь, экземплярным свойством класса AcadApplication.

    В качестве альтернативного способа, вы можете выполнять своё встроенное .NET приложение посредством использования в нём технологии COM interop.

Примечание:

ProgID (идентификатор программы) для доступа к COM приложению AutoCAD 2010, прописан в реестре Windows как AutoCAD.Application.18 (текстовое значение).

Код VB.Net

   1:  Imports System
   2:  Imports System.Runtime.InteropServices
   3:  Imports Autodesk.AutoCAD.Interop
   4:  Imports Autodesk.AutoCAD.Runtime
   5:  Imports Autodesk.AutoCAD.ApplicationServices 
   6:   
   7:  <CommandMethod("ConnectToAcad")> _
   8:  Public Sub ConnectToAcad()
   9:    Dim acAppComObj As AcadApplication
  10:    Dim strProgId As String = "AutoCAD.Application.18"
  11:    On Error Resume Next
  12:    '' Получить запущенный экземпляр AutoCAD
  13:    acAppComObj = GetObject(, strProgId)
  14:    '' Если нет ни одного запущенного приложения AutoCAD, получаем ошибку.
  15:    If Err.Number > 0 Then
  16:        Err.Clear()
  17:        '' создаём новый экземпляр приложения AutoCAD
  18:        acAppComObj = CreateObject("AutoCAD.Application.18")
  19:        '' Проверяем, что экземпляр приложения AutoCAD был создан
  20:        If Err.Number > 0 Then
  21:           Err.Clear()
  22:           '' Если экземпляр приложения AutoCAD не был создан, сообщаем об этом вы завершаем работу
  23:           MsgBox("Экземпляр приложения 'AutoCAD.Application' не был создан.")
  24:           Exit Sub
  25:        End If
  26:    End If
  27:    '' Отображаем приложение и выводим его имя и версию
  28:    acAppComObj.Visible = True
  29:    MsgBox("Сейчас запущен " & acAppComObj.Name & " версии " & acAppComObj.Version)
  30:    '' Получаем текущий документ
  31:    Dim acDocComObj As AcadDocument
  32:    acDocComObj = acAppComObj.ActiveDocument
  33:    '' Не обязательно: загружаем вашу сборку и запускаем команду, определённую в ней.
  34:    '' Или же, если ваша сборка уже загружена, просто запускаем команду вашей сборки, являющейся встроенным процессом.
  35:    acDocComObj.SendCommand("(command " & Chr(34) & "NETLOAD" & Chr(34) & " " & _
  36:                            Chr(34) & "c:/myapps/mycommands.dll" & Chr(34) & ") ")
  37:    acDocComObj.SendCommand("MyCommand ")
  38:  End Sub

код C#

   1:  using System;
   2:  using System.Runtime.InteropServices;
   3:  using Autodesk.AutoCAD.Interop;
   4:  using Autodesk.AutoCAD.Runtime;
   5:  using Autodesk.AutoCAD.ApplicationServices
   6:  //Данный метод следует разместить в составе какого-нибудь класса
   7:  [CommandMethod("ConnectToAcad")]
   8:  public static void ConnectToAcad()
   9:  {
  10:    AcadApplication acAppComObj = null;
  11:    const string strProgId = "AutoCAD.Application.18";
  12:    // Получение запущенного экземпляра приложения AutoCAD
  13:    try
  14:    {
  15:        acAppComObj = (AcadApplication)Marshal.GetActiveObject(strProgId);
  16:    }
  17:    catch // Можем получить ошибку, если искомый экземпляр AcadApplication не запущен
  18:    {
  19:        try
  20:        {
  21:            // Создать новый экземпляр AutoCAD
  22:            acAppComObj = (AcadApplication)Activator.CreateInstance(Type.GetTypeFromProgID(strProgId), true);
  23:        }
  24:        catch
  25:        {
  26:            // Если экземпляр AutoCAD не создан - вывести соответствующее сообщение об этом и завершить работу
  27:            System.Windows.Forms.MessageBox.Show("Не удалось создать экземпляр класса 'AutoCAD.Application'");
  28:            return;
  29:        }
  30:    }
  31:    // Отобразить приложение и вывести информацию о его имени и версии
  32:    acAppComObj.Visible = true;
  33:    System.Windows.Forms.MessageBox.Show("Сейчас выполняется " + acAppComObj.Name + 
  34:                                         " версии " + acAppComObj.Version);
  35:    // Получить ссылку на текущий документ
  36:    AcadDocument acDocComObj;
  37:    acDocComObj = acAppComObj.ActiveDocument;
  38:    // Не обязательно: загрузить вашу сборку и запустить команду, определённую в её составе, или, 
  39:    //если ваша сборка уже загружена - просто запустите вашу команду.
  40:    acDocComObj.SendCommand("(command " + (char)34 + "NETLOAD" + (char)34 + " " +
  41:                            (char)34 + "c:/myapps/mycommands.dll" + (char)34 + ") ");
  42:    acDocComObj.SendCommand("MyCommand ");
  43:  }

Код VBA / ActiveX

   1:  Sub ConnectToAcad()
   2:      Dim acadApp As AcadApplication
   3:      On Error Resume Next
   4:      Set acadApp = GetObject(, "AutoCAD.Application.18")
   5:      If Err Then
   6:          Err.Clear
   7:          Set acadApp = CreateObject("AutoCAD.Application.18")
   8:          If Err Then
   9:              MsgBox Err.Description
  10:              Exit Sub
  11:          End If
  12:      End If
  13:      acadApp.Visible = True
  14:      MsgBox "Сейчас запущен " + acadApp.Name + _
  15:             " версии " + acadApp.Version
  16:      Dim acadDoc as AcadDocument
  17:      Set acadDoc = acadApp.ActiveDocument
  18:      '' Не обязательно: загрузите вашу сборку и запустите команду, определённую в ней или, 
  19:      '' если ваша сборка уже загружена, просто запустите нужную вам команду.
  20:      acadDoc.SendCommand("(command " & Chr(34) & "NETLOAD" & Chr(34) & " " & _
  21:                          Chr(34) & "c:/myapps/mycommands.dll" & Chr(34) & ") ")
  22:      acadDoc.SendCommand("MyCommand ")
  23:  End Sub

Comments