Загрузка библиотек и данные приложения

Загрузка библиотек

Для загрузки управляемых сборок имеется отдельная команда NETLOAD.

Инициализация управляемых приложений

Для корректной загрузки .NET-приложений в одном из классов необходимо реализовать интерфейс Autodesk.AutoCAD.Runtime.IExtensionApplication (предоставляет методы Initialize() и Terminate()). Поскольку управляемые приложения нельзя выгрузить вручную, любая реализация метода Terminate() вызывается при закрытии AutoCAD.

Если ваше приложение определяет большое количество типов данных, вы можете оптимизировать его производительность при загрузке, реализовав IExtensionApplication и используя 2 необязательных пользовательских атрибута: ExtensionApplication и CommandClass - помогают AutoCAD найти процедуру инициализации приложения и обработчики команд. Любые управляемые приложения могут использовать эти атрибуты. Однако эффект их использования будет заметен только в приложениях со сложной логикой.

Использование ExtensionApplication и CommandClass

Когда программа AutoCAD загружает управляемое приложение, она запрашивает сборку приложения на наличие атрибута ExtensionApplication. Если такой атрибут найден, AutoCAD устанавливает связанный с ним тип в качестве точки входа приложения. Если такой атрибут не найден, AutoCADищет во всех экспортируемых типах реализацию IExtensionApplication. Если реализация не найдена, программа AutoCAD пропускает шаг инициализации, специфичный для приложения. Атрибут ExtensionApplication может быть присоединен только к одному классу. Класс, к которому он присоединен, должен реализовывать интерфейс IExtensionApplication. Помимо поиска реализации IExtensionApplication в приложении, AutoCAD запрашивает сборку приложения на наличие одного или нескольких атрибутов CommandClass. Если экземпляры этого атрибута найдены, программа AutoCAD ищет методы команд только в связанных с ними типах. В противном случае выполняется поиск во всех экспортируемых типах. Атрибут CommandClass может быть объявлен для любого класса, содержащего обработчики команд AutoCAD. Ниже описано, как используются эти атрибуты.

  1. Определите тип, реализующий Autodesk.AutoCAD.Runtime.IExtensionApplication. Если вам не нужно выполнять задачи инициализации или завершения, оставьте пустые реализации методов интерфейса;

  2. В контексте сборки (пространстве имен любого файла) объявите атрибут ExtensionApplication;

  3. Передайте тип, реализующий интерфейс IExtensionApplication, в атрибут ExtensionApplication.

  4. В контексте сборки объявите атрибут CommandClass для каждого класса, определяющего методы команд AutoCAD.

  5. Передайте тип класса метода команды в атрибут CommandClass.

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Interop;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;

[assembly: ExtensionApplication(typeof(Loader))]
[assembly: CommandClass(typeof(HelloWorldCommands))]
public class Loader : IExtensionApplication
{
    public class HelloWorldCommands
    {
        [CommandMethod("HELLO1")]
        public void HelloCommand1()
        {
            Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("HELLO1");
        }
    }
    public void Initialize()
    {
    }
    public void Terminate()
    {
    }
}
public class HelloWorldCommands
{
    [CommandMethod("HELLO2")]
    public void HelloCommand2()
    {
        Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("HELLO2");
    }
}

Пользовательские данные для документа

В AutoCAD .NET API имеется возможность сохранить какие-либо данные на уровне чертежа.

При загрузке исполняемой библиотеки в AutoCAD, запрашиваются классы, помеченные атрибутом PerDocumentClass. Если был найден такой класс (классы), то для каждого открытого документа (Document) создается экземпляр класса данного типа; далее в сессии приложения для каждого нового документа повторяется создание таких классов. Тип (класса), связанный с атрибутом PerDocumentClass должен удовлетворять следующим правилам (на выбор):

  • иметь публичный конструктор, принимающий в качестве аргумента объект Autodesk.AutoCAD.ApplicationServices.Document;
  • иметь публичный статический метод Create, также принимающий в качестве аргумента объект Autodesk.AutoCAD.ApplicationServices.Document и возвращающий новый объект данного типа. Если имеется статический метод Create, он будет использован предпочтительно конструктору (если он также существует).

Создаваемый экземпляр класса будет "знать", к какому документ он будет привязан (так как документ фигурирует в аргументах для создания экземпляра класса). Следующая процедура описывает использование атрибута PerDocumentClass. В исходном коде загружаемой сборки объявите атрибут PerDocumentClass для каждого класса, который вы хотите связать с каждым из документов.