Последние сообщения

Последние сообщения

Страницы: 1 2 [3] 4 5 ... 10
21
AutoCAD .NET API / Re: AutoCAD 2025 - переползаю на Net8
« Последний ответ от avc 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 прежде чем это делать. Вдруг они что-то знают?...
22
AutoCAD .NET API / Re: AutoCAD 2025 - переползаю на Net8
« Последний ответ от avc 28-03-2024, 07:55:36 »
ИМХО проблема в другом - в ключах запуска acad, насколько я помню, нельзя прописать загрузку dll. И приходится делать scr-файл, который и подсовывать под загрузку
Так через .bundle-папку запуск плагинов по любому. В PackageContents.xml указана пусковая dll. Иначе в AppStore не примут.
23
AutoCAD .NET API / Re: AutoCAD 2025 - переползаю на Net8
« Последний ответ от avc 28-03-2024, 07:52:03 »
Версию сборки также можно руками прописать в csproj:
<Version>1.2.3.4</Version>
Вот жеж... этого вообще нигде не находил... Теперь вся настройка скрыта в тайных кодах... Массоны писали Net8.0 ???  :D
Но использовать общий AssemblyInfo все-таки удобнее. В одном месте меняю версию и все проекты перекомпилируется с этим номером.
Просто в инструкциях по переходу пишут, что "AssemblyInfo больше не используется". Так как будто нельзя использовать. Ан нет, можно.
24
AutoCAD .NET API / Re: AutoCAD 2025 - переползаю на Net8
« Последний ответ от Алексей Кулик 28-03-2024, 07:44:03 »
ИМХО проблема в другом - в ключах запуска acad, насколько я помню, нельзя прописать загрузку dll. И приходится делать scr-файл, который и подсовывать под загрузку
25
AutoCAD .NET API / Re: AutoCAD 2025 - переползаю на Net8
« Последний ответ от avc 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, а не только из длинного неудобного контекстного меню проекта.
26
AutoCAD .NET API / Re: AutoCAD 2025 - переползаю на Net8
« Последний ответ от Алексей Кулик 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>
Насчет ресурсов ничего не скажу, пока не требовалось. А ресурсные библиотеки под меню у меня все равно в отдельном проекте болтаются...
---
Согласен, что многое (если не все) непривычно и далеко не всегда очевидно. Но все же решаемо ИМХО :)
27
AutoCAD .NET API / Re: AutoCAD 2025 - переползаю на Net8
« Последний ответ от Привалов Дмитрий 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 будут и далее развиваться параллельно.
28
AutoCAD .NET API / Re: Данные в атрибутах блока в мультивыноске
« Последний ответ от alz 27-03-2024, 22:20:48 »
Очень много лишнего, зачем лезть в описание блока? Берете сразу вставку через свойство мультивыноски
https://help.autodesk.com/view/OARX/2024/ENU/?guid=OARX-ManagedRefGuide-Autodesk_AutoCAD_DatabaseServices_MLeader_BlockContentId
29
AutoCAD .NET API / Данные в атрибутах блока в мультивыноске
« Последний ответ от Atomohod 27-03-2024, 21:35:43 »
Здравствуйте!
Борюсь с такой задачей - есть мультивыноска в которой в качестве контента привязан пользовательский блок с атрибутами. Нужно считать значения атрибутов из этого блока внутри выноски. Написал такой код:
Код - C# [Выбрать]
  1.  [CommandMethod("GetMultileaderAttributeInfo")]
  2.  public void GetMultileaderAttributeInfo()
  3.  {
  4.      Document acDoc = Application.DocumentManager.MdiActiveDocument;
  5.      Database acCurDb = acDoc.Database;
  6.  
  7.      using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  8.      {
  9.          // Prompt the user to select a multileader
  10.          PromptEntityOptions peo = new PromptEntityOptions("\nSelect a multileader: ");
  11.          peo.SetRejectMessage("\nSelected entity is not a multileader.");
  12.          peo.AddAllowedClass(typeof(MLeader), false);
  13.          PromptEntityResult per = acDoc.Editor.GetEntity(peo);
  14.  
  15.          if (per.Status != PromptStatus.OK) return;
  16.  
  17.          ObjectId mlId = per.ObjectId;
  18.          MLeader ml = (MLeader)acTrans.GetObject(mlId, OpenMode.ForRead);
  19.        
  20.          // Check if the multileader has block content
  21.          if (ml.ContentType == ContentType.BlockContent)
  22.          {
  23.              BlockTableRecord btr = acTrans.GetObject(ml.BlockContentId, OpenMode.ForWrite) as BlockTableRecord;
  24.  
  25.              if (btr.HasAttributeDefinitions)
  26.              {
  27.                  ObjectIdCollection breferences = btr.GetBlockReferenceIds(true, false);
  28.                  foreach (ObjectId item in breferences)
  29.                  {
  30.  
  31.                      BlockReference blkRef = (BlockReference)acTrans.GetObject(item, OpenMode.ForRead);
  32.  
  33.                    
  34.  
  35.                        
  36.                          // Iterate through the block's attributes
  37.                          foreach (ObjectId attId in blkRef.AttributeCollection)
  38.                          {
  39.                              AttributeReference attRef = (AttributeReference)acTrans.GetObject(attId, OpenMode.ForRead);
  40.                              Editor ed = acDoc.Editor;
  41.                              ed.WriteMessage($"Attribute Tag: {attRef.Tag}, Value: {attRef.TextString}");
  42.                          }
  43.                      
  44.                  }
  45.  
  46.  
  47.              }
  48.          }
  49.          else
  50.          {
  51.              Console.WriteLine("The selected multileader does not have block content.");
  52.          }
  53.  
  54.          acTrans.Commit();
  55.      }
  56.  }

Но проблема в том что я не знаю как добраться до blockreference который привязан к конкретной выделенной в данный момент выноске. Я перебираю просто все вставки блока, но не понимаю, как определить где нужная.
30
AutoCAD .NET API / AutoCAD 2025 - переползаю на Net8
« Последний ответ от avc 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>
Страницы: 1 2 [3] 4 5 ... 10