Загрузка dll библиотеки, работающей с EntityFramework, в AutoCad

Автор Тема: Загрузка dll библиотеки, работающей с EntityFramework, в AutoCad  (Прочитано 6500 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Приветствую всех на данном форуме!

Spoiler:
https://adn-cis.org/forum/index.php?topic=9847.15

Это изучил/поэкспериментировал насколько это было возможно. Не всё, что там писали я понял до конца в силу хаотичности сообщений и в силу своей квалификации.

Вот это:
https://adn-cis.org/forum/index.php?topic=1110.msg9973#msg9973
также читал, применил. Хотя когда сделал понял, что скорее всего к моей проблеме это имеет посредственное отношение.

Начну излагать проблему из глубин:
Изначально разработал приложение на WPF (WPF форма) с EntityFrameWorkCore для администрирования базы данных (далее - БД)(прямо скажем, приложение не сложное, если не сказать, что примитивное). Опыт работы с БД был и раньше, но "в лоб" - через ADO DB и запросы прямые запросы SQL.

Конечно, вариант с EntityFrameWorkCore мне понравился куда больше и я решил такое приложение внедрить в dll под AutoCad.

Для корректной работы EntityFrameWorkCore требуются дополнительные разные сборки:



На картинке показаны далеко не все.

Собственно никаких проблем до момента загрузки этой dll в AutoCad (пробовал на AutoCad 2022, AutoCad 2023) не возникает.

Далее всё как обычно: NETLOAD - >выбираю dll -> и вот это:

Команда: NETLOAD
Не удалось загрузить сборку. Сведения об ошибке: System.IO.FileNotFoundException: Не удалось загрузить файл или сборку "System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" либо одну из их зависимостей. Не удается найти указанный файл.
Имя файла: 'System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
   в System.Reflection.RuntimeAssembly.GetExportedTypes(RuntimeAssembly assembly, ObjectHandleOnStack retTypes)
   в System.Reflection.RuntimeAssembly.GetExportedTypes()
   в Autodesk.AutoCAD.ApplicationServices.AutoCADApplicationHolder.Initialize(Assembly assembly)
   в Autodesk.AutoCAD.ApplicationServices.ExtensionLoader.ProcessAssembly(Assembly assembly)
=== Информация о состоянии предварительной привязки ===
Журнал: DisplayName = System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 (Fully-specified)
Журнал: Appbase = file:///C:/Program Files/Autodesk/AutoCAD 2023/
Журнал: Initial PrivatePath = NULL
Вызов сборки: Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51.
===
Журнал: данная привязка начинается в контексте загрузки LoadFrom.
Предупреждение: собственный не будет проверен в контексте LoadFrom. Собственный образ будет проверен только в контексте загрузки по умолчанию, например, при помощи Assembly.Load().
Журнал: используется файл конфигурации приложения: C:\Program Files\Autodesk\AutoCAD 2023\acad.exe.Config.
Журнал: используется файл конфигурации главного узла:
Журнал: используется файл конфигурации компьютера из C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
Журнал: ссылка после применения политики: System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
Журнал: попытка скачивания нового URL file:///C:/Program Files/Autodesk/AutoCAD 2023/System.Threading.Tasks.Extensions.DLL.
Журнал: попытка скачивания нового URL file:///C:/Program Files/Autodesk/AutoCAD 2023/System.Threading.Tasks.Extensions/System.Threading.Tasks.Extensions.DLL.
Журнал: попытка скачивания нового URL file:///C:/Program Files/Autodesk/AutoCAD 2023/System.Threading.Tasks.Extensions.EXE.
Журнал: попытка скачивания нового URL file:///C:/Program Files/Autodesk/AutoCAD 2023/System.Threading.Tasks.Extensions/System.Threading.Tasks.Extensions.EXE.
Журнал: попытка скачивания нового URL file:///C:/Users/localuser/Desktop/C#/SO/Test/Test_EFW_NEWFramework/Test_EFW_NEWFramework/bin/Debug/System.Threading.Tasks.Extensions.DLL.
Предупреждение: при проверке имени сборки обнаружено несовпадение: Revision Number
Журнал: попытка скачивания нового URL file:///C:/Users/localuser/Desktop/C#/SO/Test/Test_EFW_NEWFramework/Test_EFW_NEWFramework/bin/Debug/System.Threading.Tasks.Extensions/System.Threading.Tasks.Extensions.DLL.
Журнал: попытка скачивания нового URL file:///C:/Users/localuser/Desktop/C#/SO/Test/Test_EFW_NEWFramework/Test_EFW_NEWFramework/bin/Debug/System.Threading.Tasks.Extensions.EXE.
Журнал: попытка скачивания нового URL file:///C:/Users/localuser/Desktop/C#/SO/Test/Test_EFW_NEWFramework/Test_EFW_NEWFramework/bin/Debug/System.Threading.Tasks.Extensions/System.Threading.Tasks.Extensions.EXE.



Разумеется, сам файл System.Threading.Tasks.Extensions.dll на месте.
Пробовал менять его свойства:
Конкретная версия: True/False (один и тот же результат - dll не загружается)
Копировать локально: True/False (один и тот же результат - dll не загружается)
Внедрить типы взаимодействия: True/False (до конца не разобрался что это, но при True сборка просто не компилируется)

Вот вроде бы я изложил всё, что делал и как экспериментировал.

Что не делал, а может быть стоит, рассчитываю получить совет:
вот тут:
1.
https://adn-cis.org/forum/index.php?topic=9847.15
сказано, что может быть такое, что приложение не загружается через NETLOAD, но загружается через add-in manifest. Как я это понял - через NETLOAD не загружается, а через BUNDLE да. И при этом требуется использовать Assembly.LoadFrom.
Правильно ли я понял? Тема, на которую я ссылаюсь посвящена Revit, мб есть различия? Если я понял правильно - то что конкретно и где нужно сделать с Assembly.LoadFrom? Автозагрузку (назовём её простой) я делать могу. Но те dll не требуют зависимостей (иных dll). Здесь вариант сложнее.

2.
В логе от AutoCad есть вот такая строка:

Предупреждение: при проверке имени сборки обнаружено несовпадение: Revision Number

Возможно проблема в этом? Но я не нашёл где и как можно посмотреть эти самые версии. Точнее не так - везде, где это можно было я посмотреть - посмотрел:
ПКМ на dll -> Подробно - > Версия: там указано 4.6.28619.1
файл app.config:

      <dependentAssembly>
  <assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
      </dependentAssembly

Тут пробовал и менять и удалять - реакции никакой.

В диспетчере NuGet пакетов:



При этом лог AutoCad:

Имя файла: 'System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'

И вот такого номера версии я вообще нигде не нашёл.

Сам файл System.Threading.Tasks.Extensions.dll указан в зависимостях для Microsoft.Bcl.AsyncInerfaces, который в свою очередь требуется для самого EntityFrameWorkCore.

Надеюсь на мудрый совет от магистров форума, потому что моих знаний (коих не так много) и моего терпения и желания пробить эту стену (коих в разы больше) не хватило.
« Последнее редактирование: 17-01-2024, 11:04:37 от Alexandr1993 »

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Что такое EntityFrameWorkCore? Net Framework знаю, Net Core знаю, EntityFrameWorkCore - не знаю

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Что такое EntityFrameWorkCore? Net Framework знаю, Net Core знаю, EntityFrameWorkCore - не знаю

https://learn.microsoft.com/ru-ru/ef/efcore-and-ef6/

Ну и на скрине в первом сообщении, где показаны зависимости он присутствует.

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
всё не то
пробуй EntityFramework
https://help.autodesk.com/view/OARX/2024/ENU/?guid=GUID-A6C680F2-DE2E-418A-A182-E4884073338A
AutoCad 2023 это .NET Framework 4.8
для core нужен net8.0 https://www.nuget.org/packages/Microsoft.EntityFrameworkCore#supportedframeworks-body-tab
а EntityFramework может с .NET Framework 4.8 https://www.nuget.org/packages/EntityFramework/

Благодарю за направление. Я примерно 2 часа назад сам пришёл к этому же. Но хотелось бы до конца разобраться в вопросе, раз уж пришлось копнуть так глубоко.

На картинке ниже версия Microsoft.EntityFrameworkCore, которую таки AutoCad "переварил".



Но этих версий очень много, получилось это исключительно благодаря подходу "пальцем в небо" - мне подсказали, что дело в .NET.Core, .NET.Framework, .NETSTANDART 2.0 и я решил перебором искать версию, которая AutoCad понравится. Нашёл. Вот её зависимости:



А вот зависимости Microsoft.EntityFrameworkCore, версия 3.1.32 (с ней пробовал изначально), которая AutoCad уже не нравится. Ну или не она сама, а версия тех библиотек, что входят в зависимости.



Для обеих версий указан .NETSTANDART2.0 - я изначально думал причина в этом. Но оказалось, что вроде бы и нет.

Какая пока мораль: локальное решение (найденное случайно) я нашёл - нужна подходящая версия Microsoft.EntityFrameworkCore.
Но критериев, по каким это определить - нет. Я не программист изначально - мб не хватает именно теоретических знаний и кто-то сможет объяснить это момент.

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
думаю проблема возникает, если версия dll'ок не совпадает с их версией в AutoCAD

Отмечено как Решение Alexandr1993 24-01-2024, 16:01:21

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

  • ADN OPEN
  • Сообщений: 18
  • Карма: 0
Закончу данную ветку.

Данную dll с применением EntityFrameWorkCore и WPF я всё таки в AutoCad запустил.

Для этого пришлось подобрать версию EntityFrameWorkCore: 2.0.0 и при установке через Nu-Get установил поведение зависимостей: Наименьший.

Таким образом избегается использование зависимых dll, которые не "нравятся" AutoCad при загрузке через NETLOAD.

Далее добавил все другие необходимые пакеты для работы с базой данных (у меня она в Access), которые успешно загружаются в AutoCad 2022, 2023, 2024.