Первое приложение NET для nanoCAD 23+

Практически шпаргалка для себя любимого. О том, как и с чего начать разработку на NET для nanoCAD версий от 23 и более поздних. На момент написания статьи под Windows доступны версии 23, 23.1, 24.
Разработку под Linux не рассматриваю (по крайней мере пока).

Разработку буду вести в Visual Studio Community, язык C#. JetBrains Rider у меня приказал долго жить, а VSCode как-то "не зашла".

Устанавливая VS, надо не забыть зайти в закладку "Отдельные модули" и поставить "Среда выполнения .NET 6.0 (долгосрочная поддержка)".
2024-03-17_14-57-03

Также крайне желательно добавить поддержку git, даже если сам git установлен в системе:
2024-03-17_14-58-38

Если на машине вдруг не установлен nanoCAD, в принципе ничего страшного. Можно зарегистрироваться как разработчик на сайте https://developer.nanocad.ru/, получить (помимо серийного номера для разработки) еще и доступ к SDK для nanoCAD, и к хоть какой-то, но оффлайн-документации.

У меня ситуация попроще: установлен nanoCAD23.1, и SDK скачан и распакован в c:\SDK\nano23 (в каталоге лежат только dll, все остальное выпилено).

Создание проекта
Так что создаю новый проект библиотеки классов Microsoft
2024-03-17_15-05-36

Следом задается имя проекту – nanoCADFirstApp
2024-03-17_15-07-08

И в качестве платформы указываю .NET 6.0:
2024-03-17_15-08-10

Начальная настройка проекта
Теперь, когда проект создан, неплохо было бы его настроить. Можно очень долго ковыряться в GUI, но иногда проще выполнить двойной клик на проекте и прямо прописать минимально необходимый набор свойств и настроек:
2024-03-17_15-11-58

Начальный вид файла проекта будет похож на нечто типа

1
2
3
4
5
6
7
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>

Первое что стоит сделать – это указать, что выходная ОС все же Windows, с минимальной версией 7:

1
<TargetFramework>net6.0-windows</TargetFramework>

Учитывая, что в конечном проекте наверняка будут разные окна, включаю поддержку WPF и WinForms:

1
2
3
4
5
6
7
8
9
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0-windows</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>
</Project>

Поскольку это не NET Framework, а NET, может сложиться ситуация, что в выходном каталоге будет (утрирую) 3 файла, а для корректной работы понадобится еще сотня-другая. И далеко не факт, что все это богатство будет установлено на клиентской машине. Следовательно, все это надо предоставлять конечному пользователю. Выхода два – либо выполнять не сборку, а публикацию приложения; либо настроить файл приложения, чтобы все необходимые файлы кидались “в выходной каталог”:

1
2
3
4
5
6
7
8
9
10
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0-windows</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
    <UseWindowsForms>true</UseWindowsForms>
    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
  </PropertyGroup>
</Project>
Подключение ссылок
Теперь надо подключить ссылки на host*.dll. Если нет SDK, но установлен nanoCAD, их можно взять из каталога установки nanoCAD (по умолчанию – %ProgramFiles%\Nanosoft\nanoCAD x64 XX.Y\bin).

Добавить ссылки можно либо через мышь и клики, либо вручную. Через мышь – правый клик на “Зависимостях” проекта, “Добавить ссылку ну проект…” (хотя в принципе не так уж и важно):
2024-03-17_15-34-29

В появившемся окне нажать “Обзор” и найти файлы hostdbmgd.dll, hostmgd.dll – этого для старта достаточно.

После этого надо раскрыть “Зависимости” проекта и для каждой из подключенных сборок установить в свойствах “Копировать локально” – “Нет”:
2024-03-17_15-38-13
2024-03-17_15-38-52
Того же самого результата можно добиться, просто редактируя файл проекта:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0-windows</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
    <UseWindowsForms>true</UseWindowsForms>
    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
  </PropertyGroup>

  <ItemGroup>
    <Reference Include="hostdbmgd">
      <HintPath>c:\SDK\nano23\hostdbmgd.dll</HintPath>
      <Private>False</Private>
    </Reference>
    <Reference Include="hostmgd">
      <HintPath>c:\SDK\nano23\hostmgd.dll</HintPath>
      <Private>False</Private>
    </Reference>
  </ItemGroup>
</Project>

Естественно, что можно и дальше настраивать проект, но для начала и этого хватит.

Первая команда для нанокада
Для начала сношу создаваемый по умолчанию Class1.cs – все равно свое буду рисовать ;) Дальше немного вкусовщины, но мне подобный подход очень даже нравится.

Первое. Создаю папку команд, и называю ее CadCommands:
2024-03-17_15-55-33

И уже внутри – создаю класс команды HelloCmd. Класс надо сделать публичным, иначе его nanoCAD просто “не увидит”. Мало того, для команд, которые для своего существования будут требовать активного документа, я ставлю класс статическим. Нестатические команды и нестатические же команды в nanoCAD могут вызываться и без документа. Что при некоторых условиях может привести к проблемам, а в некоторых будет спасением ;) Так что получаю нечто типа:

1
2
3
4
5
6
namespace nanoCADFirstApp.CadCommands
{
    public static class HelloCmd
    {
    }
}

Для ради интересу пропишу почти стандартный HelloWorld. Только сделаю две команды – одна будет выводить в ком.строку сообщение, вторая – в MessageBox. Так что HelloCmd переименую в HelloConsoleCmd:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using HostMgd.ApplicationServices;
using HostMgd.EditorInput;
using Teigha.Runtime;
using Application = HostMgd.ApplicationServices.Application;

namespace nanoCADFirstApp.CadCommands
{
    public static class HelloConsoleCmd
    {
        [CommandMethod("-hello")]
        public static void HelloConsoleCommand()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            if (doc == null)
            {
                // Если каким-то чудом активного документа нет, выходим
                return;
            }

            Editor ed = doc.Editor;

            ed.WriteMessage("\nHello to console");
        }
    }
}

И рядом кидаю второй класс, под команду с выводом в MessageBox:

1
2
3
4
5
6
7
8
9
10
11
12
13
using Teigha.Runtime;

namespace nanoCADFirstApp.CadCommands
{
    public static class HelloDlgCmd
    {
        [CommandMethod("hello")]
        public static void HelloDlgCommand()
        {
            MessageBox.Show("Hello to MessageBox", "First Application", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}

Если бы в файле проекта не было прописано “UseWindowsForms”, вторую команду прописать бы не удалось.

Запуск nanoCAD и загрузка
Все, пришла пора смотреть, что у нас получится после сборки и загрузки библиотеки внутрь nanoCAD. Для начала просто сборка (при настройках клавиатуры студии для Visual C# 2005 сборка выполняется по нажатию на клавишу F6; но ее также можно выполнить по контекстному меню для проекта). В консоли VisualStuio будет выведено нечто типа

1
2
3
4
5
6
7
8
Сборка начата в 16:18...
1>------ Сборка начата: проект: nanoCADFirstApp, Конфигурация: Debug Any CPU ------
1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets(2389,5): warning MSB3270: несоответствие между архитектурой процессора проекта "MSIL", сборка которого выполняется, и архитектурой процессора ссылки "hostdbmgd", "AMD64". Это несоответствие может привести к ошибкам во время выполнения. Рекомендуется изменить целевую архитектуру процессора для проекта с помощью диспетчера конфигураций, чтобы согласовать архитектуры процессоров для проекта и ссылок, или использовать зависимость от ссылок с архитектурой процессора, соответствующей целевой архитектуре процессора проекта.
1>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets(2389,5): warning MSB3270: несоответствие между архитектурой процессора проекта "MSIL", сборка которого выполняется, и архитектурой процессора ссылки "hostmgd", "AMD64". Это несоответствие может привести к ошибкам во время выполнения. Рекомендуется изменить целевую архитектуру процессора для проекта с помощью диспетчера конфигураций, чтобы согласовать архитектуры процессоров для проекта и ссылок, или использовать зависимость от ссылок с архитектурой процессора, соответствующей целевой архитектуре процессора проекта.
1>nanoCADFirstApp -> C:\Users\kpblc\source\repos\nanoCADFirstApp\nanoCADFirstApp\bin\Debug\net6.0-windows\nanoCADFirstApp.dll
1>Сборка проекта "nanoCADFirstApp.csproj" завершена.
========== Сборка: успешно выполнено — 1 , со сбоем — 0, в актуальном состоянии — 0, пропущено — 0 ==========
========== Сборка завершено в 16:18 и заняло 07,604 с ==========

Больше всего интересует путь вывода (если его, конечно, не меняли принудительно): C:\Users\kpblc\source\repos\nanoCADFirstApp\nanoCADFirstApp\bin\Debug\net6.0-windows\nanoCADFirstApp.dll

Его надо запомнить (ну в буфер обмена закинуть, к примеру). Запуск nanoCAD, далее команда _netload. В окне как раз и надо ввести запомненный путь к сборке. Ну и после загрузки вводим обе команды: hello и -hello.

По вызову hello:
2024-03-17_16-26-13

Ну а по вызову -hello в ком.строке:

1
2
3
4
5
*Отмена*
Команда: -hello

-hello - -hello
Hello to console

Но это самый простой для начала, и, как следствие – самый затратный по времени способ загрузки и проверки работы приложения. Ну сами посудите – собрать проект, запустить nanoCAD, вручную загрузить приложение с риском ошибиться… Может, есть вариант “побыстрее да попроще”?

К сожалению, есть. Нужно выполнить настройку свойств отладки проекта:

2024-03-17_16-30-54

Создаю новый профиль:
2024-03-17_16-32-45

Сразу же его переименовываю, к примеру, в nanoCAD:
2024-03-17_16-33-49

Обязательно указывю путь к ncad.exe:
2024-03-17_16-37-04
Для начала впрямую указываю путь к компилируемой сборке:
2024-03-17_16-37-26

Теперь можно попробовать сразу запустить проект, по клавише F5. В идеале сборка должна загрузиться в nanoCAD и команды hello и -hello будут доступны. Единственное – надо установить активную конфигурацию:
2024-03-17_16-39-10

Вроде бы даже работает. Напрягает одно – прописывание абсолютного пути к загружаемой сборке. Подключаю документацию MS и получаю следующее:
2024-03-17_16-48-10

Для того, чтоб не переколачивать все вручную:
путь к исполняемому файлу: C:\Program Files\Nanosoft\nanoCAD x64 23.1\nCad.exe
аргументы командной строки : -g $(TargetPath)

Репозиторий болтается https://github.com/kpblc2000/nanoCADFirstApp

Размещено в .NET, nanoCAD, Новости · Метки:



Поделитесь своим мнением


Я не робот.