Первое приложение NET для nanoCAD 23+
Автор: Кулик Алексей aka kpblc | Дата: 17 Март 2024 · Прокомментировать
Практически шпаргалка для себя любимого. О том, как и с чего начать разработку на NET для nanoCAD версий от 23 и более поздних. На момент написания статьи под Windows доступны версии 23, 23.1, 24.
Разработку под Linux не рассматриваю (по крайней мере пока).
Разработку буду вести в Visual Studio Community, язык C#. JetBrains Rider у меня приказал долго жить, а VSCode как-то "не зашла".
Устанавливая VS, надо не забыть зайти в закладку "Отдельные модули" и поставить "Среда выполнения .NET 6.0 (долгосрочная поддержка)".
Также крайне желательно добавить поддержку git, даже если сам git установлен в системе:
Если на машине вдруг не установлен nanoCAD, в принципе ничего страшного. Можно зарегистрироваться как разработчик на сайте https://developer.nanocad.ru/, получить (помимо серийного номера для разработки) еще и доступ к SDK для nanoCAD, и к хоть какой-то, но оффлайн-документации.
У меня ситуация попроще: установлен nanoCAD23.1, и SDK скачан и распакован в c:\SDK\nano23 (в каталоге лежат только dll, все остальное выпилено).
Начальный вид файла проекта будет похож на нечто типа
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> |
Добавить ссылки можно либо через мышь и клики, либо вручную. Через мышь – правый клик на “Зависимостях” проекта, “Добавить ссылку ну проект…” (хотя в принципе не так уж и важно):
В появившемся окне нажать “Обзор” и найти файлы hostdbmgd.dll, hostmgd.dll – этого для старта достаточно.
После этого надо раскрыть “Зависимости” проекта и для каждой из подключенных сборок установить в свойствах “Копировать локально” – “Нет”:
Того же самого результата можно добиться, просто редактируя файл проекта:
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> |
Естественно, что можно и дальше настраивать проект, но для начала и этого хватит.
Первое. Создаю папку команд, и называю ее CadCommands:
И уже внутри – создаю класс команды 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”, вторую команду прописать бы не удалось.
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 в ком.строке:
1 2 3 4 5 | *Отмена* Команда: -hello -hello - -hello Hello to console |
Но это самый простой для начала, и, как следствие – самый затратный по времени способ загрузки и проверки работы приложения. Ну сами посудите – собрать проект, запустить nanoCAD, вручную загрузить приложение с риском ошибиться… Может, есть вариант “побыстрее да попроще”?
К сожалению, есть. Нужно выполнить настройку свойств отладки проекта:
Сразу же его переименовываю, к примеру, в nanoCAD:
Обязательно указывю путь к ncad.exe:
Для начала впрямую указываю путь к компилируемой сборке:
Теперь можно попробовать сразу запустить проект, по клавише F5. В идеале сборка должна загрузиться в nanoCAD и команды hello и -hello будут доступны. Единственное – надо установить активную конфигурацию:
Вроде бы даже работает. Напрягает одно – прописывание абсолютного пути к загружаемой сборке. Подключаю документацию MS и получаю следующее:
Для того, чтоб не переколачивать все вручную:
путь к исполняемому файлу: C:\Program Files\Nanosoft\nanoCAD x64 23.1\nCad.exe
аргументы командной строки : -g $(TargetPath)