AutoCAD 2025 - переползаю на Net8

Автор Тема: AutoCAD 2025 - переползаю на Net8  (Прочитано 422 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
AutoCAD 2025 - переползаю на Net8
« : 27-03-2024, 19:08:04 »
Эта тема - не вопрос. Просто делюсь опытом.
Итак Autodesk внял мольбам и дал возможность программировать на современном C#. Но эта хорошая затея вылилась в большую головную боль. И будет теперь болью надолго.
Главная проблема: Microsoft не довели до ума этот Net8 и потеряли уйму совершенно необходимой функциональности. В эту версию не встроена работа с реестром Windows, c железом (WMI), с данными (SQL) и так далее. Отчасти это решается закачкой отдельных библиотек (NuGet). И вот тут начинается свистопляска. У библиотек этих куча несовместимых версий. В сам AutoCAD как оказалось входят старые версии и надо компилировать именно под них. Несколько версий одной библиотеки в один AutoCAD не загрузишь и если разные плагины на разные версии скомпилированы, то это не просто сбой, это фатал AutoCAD. А завтра Autodesk обновит эти библиотеки и все плагины надо будет перекомпилировать. В общем стараниями Microsoft, мы погрузились в темные древние времена вечно несовместимых ActiveX...
Теперь по порядку.
Старые проекты не скомпилировать под Net8. Надо создавать новый проект. Есть плагин к VS для миграции. Но он не работает. Он не перененосит настройки из AssemblyInfo, теряет все ресурсы форм и компонентов WinForms, не подгружает недостающие библиотеки, забытые Microsoft. Создаем проект с ноля - так быстрее.
Ищем нужные NuGet пакеты. Из того что у меня используется, оказалось что System.Managment уже есть в AutoCAD 2025. Но (!) он там старый, версия 6.0. Нужно именно 6.0 подключать к проекту, иначе будет фатал при попытке принудительной загрузки нового 8.0 или при инициализации классов его использующих (если не пытаться загружать dll принудительно).
Далее из всех этих NuGet надо вытащить нужные dll и доставить их всем пользователям плагинов!! Теперь ваш плагин это сложная составная программа, а не один файл. Увы. Придется делать инсталлятор, если у вас его еще нет. Вытащить dll не просто. У этих NuGet нет свойства "копировать в целевую папку". И вообще с удобным визуальным интерфейсом настроек проекта Microsoft распрощались. Теперь все полезные настройки надо долго гуглить и вставлять в жуткий html-файл проекта. Брррр. Настройка, чтоб dll копировались в папку плагина:
Код - XML [Выбрать]
  1. <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

Теперь нам надо у пользователя загрузить эти dll. Но в папке плагина Автокад их не находит. Либо надо требовать права админа инсталлтору и закидывать в системные папки (я пробовал прям в папку AutoCAD - это работает). Либо в коде прописать принудительную загрузку. В Initialize добавляем:
Код - C# [Выбрать]
  1.         if (CadApp.Version.Major >= 25) // Net8
  2.         {
  3.           Assembly.LoadFrom(Path.Combine(path, "System.CodeDom.dll"));
  4.           Assembly.LoadFrom(Path.Combine(path, "System.Data.SqlClient.dll"));
  5.           Assembly.LoadFrom(Path.Combine(path, "System.Management.dll"));
  6.         }
А вот например sni.dll загружать почему-то нельзя. Сам загрузится из System.Data.SqlClient.dll. Многие пишут что надо менять System.Data.SqlClient на Microsoft.Data.SqlClient. Но нет, там совсем другие классы и методы, старый код не компилируется.

Далее у нас получился проект без версии. Добавляем в него наш старый AssemblyInfo как ссылку и опять лезем в конфиг проекта:
Код - XML [Выбрать]
  1.     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  2.     <GenerateAssemblyVersionAttribute>true</GenerateAssemblyVersionAttribute>
Без второй строчки (о которой никто не пишет!!) версия dll не будет видна в проводнике Windows.

Теперь надо еще сам код редактировать. К запуску процессов добавляем UseShellExecute = true:
Код - C# [Выбрать]
  1. #if NET8_0_OR_GREATER
  2.         Process.Start(new ProcessStartInfo(myexe) { UseShellExecute = true });
  3. #else
  4.         Process.Start(myexe);
  5. #endif

Еще у меня появился конфликт RegistryKey с автокадовским API
Код - C# [Выбрать]
  1. #if NET8_0_OR_GREATER
  2. using RegistryKey = Microsoft.Win32.RegistryKey;
  3. #endif

VS завалила меня бредовыми предупреждениями. Заблокировал тоже в файле проекта:
Код - XML [Выбрать]
  1.     <NoWarn>
  2.                 1701;1702;CA1416;SYSLIB0021;SYSLIB0022;SYSLIB0011;SYSLIB0014
  3.         </NoWarn>

Еще шаманил с ресурсами. Итого начало файла проекта получилось таким:
Код - XML [Выбрать]
  1. <Project Sdk="Microsoft.NET.Sdk">
  2.   <PropertyGroup>
  3.     <TargetFramework>net8.0-windows</TargetFramework>
  4.         <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  5.     <OutputType>Library</OutputType>
  6.     <RootNamespace>AVC</RootNamespace>
  7.     <AssemblyName>AVC_Plugin_Ac25</AssemblyName>
  8.     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  9.         <GenerateAssemblyVersionAttribute>true</GenerateAssemblyVersionAttribute>
  10.         <UseWindowsForms>true</UseWindowsForms>
  11.     <UseWPF>true</UseWPF>
  12.     <ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
  13.         <AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
  14.         <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
  15.         <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
  16.     <GenerateResourceWarnOnBinaryFormatterUse>false</GenerateResourceWarnOnBinaryFormatterUse>
  17.   </PropertyGroup>
  18.   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  19.     <OutputPath>C:\Users\shurik\AppData\Roaming\Autodesk\ApplicationPlugins\AVC_Pro.bundle\Contents\Windows\</OutputPath>
  20.     <DefineConstants>DEBUG;TRACE;CAD</DefineConstants>
  21.     <LangVersion>preview</LangVersion>
  22.   </PropertyGroup>
  23.   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
  24.     <DebugType>none</DebugType>
  25.     <OutputPath>C:\Users\shurik\AppData\Roaming\Autodesk\ApplicationPlugins\AVC_Pro.bundle\Contents\Windows\</OutputPath>
  26.     <DefineConstants>CAD;STOPHACK</DefineConstants>
  27.     <LangVersion>preview</LangVersion>
  28.     <NoWarn>
  29.                 1701;1702;CA1416;SYSLIB0021;SYSLIB0022;SYSLIB0011;SYSLIB0014
  30.         </NoWarn>

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
Re: AutoCAD 2025 - переползаю на Net8
« Ответ #1 : 27-03-2024, 22:29:18 »
Главная проблема: Microsoft не довели до ума этот Net8 и потеряли уйму совершенно необходимой функциональности. В эту версию не встроена работа с реестром Windows, c железом (WMI), с данными (SQL) и так далее.
Формулировка не верная, довела до ума, но под другие задачи.
.NET(.NET Core) это мультиплатформенные решения, которые должны одинаково выполняться на различных ОС. В них оставили только общий функционал для всех платформ.
Не стоит ожидать появления например работу с ActiveX и работу с реестром в .NET
Более того не очень понятно, что в .NET с Winforms, WPF, MAUI и т.д. похоже Microsoft не планирует переносить все на Linux, т.к. они слишком завязаны на Windows.

Для разработки под Windows, .NET менее функционален, чем .NET Framework.
Наверное ветки .NET и .NET Framework будут и далее развиваться параллельно.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: AutoCAD 2025 - переползаю на Net8
« Ответ #2 : 27-03-2024, 23:01:00 »
Позволю себе немного не согласиться :)
NET6 (на котором я на данный момент сижу), и, подозреваю, NET8 - совершенно другая платформа.
Действительно, многое, что в NET FrameWork было "из коробки", придется доставлять NuGet-пакетами (там не только реестр, но и кодировки файлов, и овердофига чего еще). Насчет совместимости ничего сказать не могу - пока не сталкивался.
Новый проект можно не создавать с нуля, а пробросить связь (Link) на старый проект. Т.е. в одном решении будет сразу два проекта - один под FrameWork, второй под NET8.
Вытаскивать из NuGet ничего не надо. Для предоставления конечным пользователям можно использовать AssemblyResolve в инициализаторе. И выполнять не сборку, а публикацию проекта. Ну или в cspoj руками прописать как ты и сделал:
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
По крайней мере у меня оно работает.
Работу с SQL, возможно, будет иметь смысл переложить на EntityFramework (который вообще положить в отдельную сборку NET Standard 2.0 для совместного использования в NET Framework и NET8). Тогда и с клиентами особо можно не заморачиваться ;)
Версию сборки также можно руками прописать в csproj:
<Version>1.2.3.4</Version>
После этого и в GUI MS VS станет доступным соответствующее поле.
Для использования в проекте WinForms достаточно прописать как и у тебя:
<UseWindowsForms>true</UseWindowsForms>
Для использования WPF - соответственно
<UseWPF>true</UseWPF>
Насчет ресурсов ничего не скажу, пока не требовалось. А ресурсные библиотеки под меню у меня все равно в отдельном проекте болтаются...
---
Согласен, что многое (если не все) непривычно и далеко не всегда очевидно. Но все же решаемо ИМХО :)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: AutoCAD 2025 - переползаю на Net8
« Ответ #3 : 28-03-2024, 07:34:26 »
Еще несколько интересных моментов.

Многие боятся, что Net8 не будут работать WinForms. Проверено, работают без всяких модификаций все стандартные и самодельные компоненты. Может со временем, всплывут нюансы, но пока все прекрасно.

Сборки, скомпилированные под Net Framework 4.8 и Net8.0 прекрасно дружат между собой. Для меня это была неожиданность, но AutoCAD 2025 прекрасно запустил мою стартовую dll (которая выбирает какую основную библиотеку запускать), хотя она под 4.8. Более того, я сделал библиотеки с общим кодом и общими ресурсами, компилирую под 4.8, а использую во всех плагинах, включая Net8.0. Компилятор прекрасно такую связь съедает и в рантайме тоже проблем нет. Лишь бы в этих общих сборках не было вызовов тех самых "потерянных" классов.

Еще была веселуха с запуском отладчика. В проекте Net8.0 некуда вписать путь запуска AutoCAD. Нагулил, что в меню Отладка появился пункт "Свойства отладки для проекта...". Он открывает секретный диалог "Профили запуска". Но этого мало. Надо еще догадаться, что в этом диалоге нужно создать новый "профиль" и вот только в нем уже можно будет прописать путь к AutoCAD 2025. Настраивается тяжело, но есть и бонус - теперь переключать запускаемый проект можно из панели инструментов VS, а не только из длинного неудобного контекстного меню проекта.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: AutoCAD 2025 - переползаю на Net8
« Ответ #4 : 28-03-2024, 07:44:03 »
ИМХО проблема в другом - в ключах запуска acad, насколько я помню, нельзя прописать загрузку dll. И приходится делать scr-файл, который и подсовывать под загрузку
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: AutoCAD 2025 - переползаю на Net8
« Ответ #5 : 28-03-2024, 07:52:03 »
Версию сборки также можно руками прописать в csproj:
<Version>1.2.3.4</Version>
Вот жеж... этого вообще нигде не находил... Теперь вся настройка скрыта в тайных кодах... Массоны писали Net8.0 ???  :D
Но использовать общий AssemblyInfo все-таки удобнее. В одном месте меняю версию и все проекты перекомпилируется с этим номером.
Просто в инструкциях по переходу пишут, что "AssemblyInfo больше не используется". Так как будто нельзя использовать. Ан нет, можно.

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: AutoCAD 2025 - переползаю на Net8
« Ответ #6 : 28-03-2024, 07:55:36 »
ИМХО проблема в другом - в ключах запуска acad, насколько я помню, нельзя прописать загрузку dll. И приходится делать scr-файл, который и подсовывать под загрузку
Так через .bundle-папку запуск плагинов по любому. В PackageContents.xml указана пусковая dll. Иначе в AppStore не примут.

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: AutoCAD 2025 - переползаю на Net8
« Ответ #7 : 28-03-2024, 08:26:40 »
Формулировка не верная, довела до ума, но под другие задачи.
.NET(.NET Core) это мультиплатформенные решения, которые должны одинаково выполняться на различных ОС. В них оставили только общий функционал для всех платформ.
Не стоит ожидать появления например работу с ActiveX и работу с реестром в .NET
Не соглашусь. Именно, что кастрировали хорошую среду. Часть чисто виндовых функций оставили, часть про...любили. Чем чисто виндовые WinForms лучше чисто виндового реестра? Что мешало эмулировать работу с реестром или WMI под линуксом? Особенно если все исходники есть. Что мешало оставить все эти фичи только для windows-программистов? Хочешь в линукс - не используй реестр. Я уж не говорю про SQL - он то вообще чем провинился? Чистый волюнтаризм.
Насчет что Net Framework останется для винды... Может и так. Хорошо бы. Но есть нехорошие намеки, что его хотят прикрыть. Например, почему-то не дают использовать все новые фичи C#. Похоже принуждают к переходу на net8. Зачем? Закрыть framework? Далее, если Net8 - это чисто для линуксов и экзотики, а для винды - framework остается, то решение внедрять net8 в виндовый AutoCAD очевидная ошибка. Но что-то я подозреваю, что в Autodesk консультировались с Microsoft прежде чем это делать. Вдруг они что-то знают?...

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
Re: AutoCAD 2025 - переползаю на Net8
« Ответ #8 : 28-03-2024, 09:46:13 »
Не соглашусь. Именно, что кастрировали хорошую среду. Часть чисто виндовых функций оставили, часть про...любили. Чем чисто виндовые WinForms лучше чисто виндового реестра?
Некоторые вещи происходят помимо наших желаний.
Intel+Microsoft постепенно теряют лидерство и долю рынка, будут приходить другие решения.
https://rb.ru/story/desktop-os-trends/
https://dzen.ru/a/ZdcTuCkWV1Dz-oUM
Интел слишком долго занималось тратой денег на выкуп собственных акций и не вкладывалась в производство.
Сейчас "срочно" строят и модифицируют фабрики, чтобы попытаться догнать азиатский регион TSMC и Samsung.
https://translated.turbopages.org/proxy_u/en-ru.ru.5ea6af14-66050aca-86b2d2bf-74722d776562/https/www.foxbusiness.com/technology/intel-plans-us-building-spree-thanks-billions-federal-chip-subsidies
"надеется увеличить долю Америки в производстве передовых чипов с 0% до 20% к 2030 году с помощью Закона о ЧИПАХ". Согласитесь очень скромно.

Microsoft на мой взгляд действует не последовательно, часто меняет подходы.
К примеру .NET мультиплатформенный, наштамповали различных GUI, но сопровождать их планируют только под Windows, странно чего хотят добиться и как будут с JAVA конкурировать.

Санкции США в отношении софта странны, они еще больше ведут к снижению доли Microsoft в мире.

Все эти вялотекущие тенденции влияют на глобальный рынок, ведут к большему потребности в мультиплатформенности решений.
это очень медленно происходит. Некоторые привычные и удобные технологии придется оставить в прошлом.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Re: AutoCAD 2025 - переползаю на Net8
« Ответ #9 : 28-03-2024, 10:33:09 »
К примеру .NET мультиплатформенный, наштамповали различных GUI, но сопровождать их планируют только под Windows, странно чего хотят добиться и как будут с JAVA конкурировать.
Не совсем так. Есть MAUI, есть Blazor, есть Avalonia. Уверен, что есть и другие варианты.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
Re: AutoCAD 2025 - переползаю на Net8
« Ответ #10 : 28-03-2024, 12:15:40 »
Не совсем так. Есть MAUI, есть Blazor, есть Avalonia. Уверен, что есть и другие варианты.
Blazor для WEB
MAUI есть, Microsoft кроссплатформенность заявляли, но отказались.
Avalonia то что нужно, но не Microsoft
Не видно единого подхода к GUI от Microsoft для .NET

Да, существуют и другие варианты