Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей Кулик от 23-06-2021, 11:23:57

Название: Как в сборку для ACAD подключить FontAwesome?
Отправлено: Алексей Кулик от 23-06-2021, 11:23:57
Пробую написать приложение под ACAD с использованием FontAwesome5. При вызове любой формы, содержащей хоть что-то от FontAwesome, получаю сообщение об ошибке типа "Файл не найден".
Смотрю - а файлы FontAwesome5, FontAwesome5.NET на самом деле рядом лежат.

Если сделать обычный exe и в него подключить эту сборку, то все показывается и все срабатывает.

Полный текст ошибки:
Цитировать
System.Windows.Markup.XamlParseException
  HResult=0x80131501
  Сообщение = Could not load file or assembly 'FontAwesome5.Net, PublicKeyToken=9cfaf01297a008f8' or one of its dependencies. Не удается найти указанный файл.
  Источник = PresentationFramework
  Трассировка стека:
   at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
   at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
   at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
   at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
   at ASpecCore.Views.UserControls.FactoryUserControl.InitializeComponent() in C:\Users\kpblc\source\repos\ASpec2\ASpecCore\Views\UserControls\FactoryUserControl.xaml:line 1

Внутреннее исключение 1:
FileNotFoundException: Could not load file or assembly 'FontAwesome5.Net, PublicKeyToken=9cfaf01297a008f8' or one of its dependencies. Не удается найти указанный файл.
И подобная ситуация повторяется на нескольких аналогичных пакетах и на разных версиях.
Что я делаю не так и каким образом можно все-таки FontAwesome (5 или аналог - непринципиально) подключить к сборке под ACAD?
Спасибо!
Название: Re: Как в сборку для ACAD подключить FontAwesome?
Отправлено: Александр Ривилис от 23-06-2021, 11:54:25
Смотрю - а файлы FontAwesome5, FontAwesome5.NET на самом деле рядом лежат.
То что они лежат рядом - это не имеет никакого значения. Ты должен их подгрузить в методе Initialize (если неуспеваешь их использовать их в каких-то статических методах до вызова Initialize). Точнее в Initialize ты должен подписаться на событие AppDomain.CurrentDomain.AssemblyResolve, а в этом событии находить и загружать соответствующий dll-файл. У нас на форуме есть примеры. Поищи по "AssemblyResolve".
Название: Re: Как в сборку для ACAD подключить FontAwesome?
Отправлено: Алексей Кулик от 23-06-2021, 12:06:47
Ок, поищу. Но почему тот же EntityFramework прекрасно подгружается и без таких шагов? Магия? :)
Название: Re: Как в сборку для ACAD подключить FontAwesome?
Отправлено: Александр Ривилис от 23-06-2021, 12:24:23
Ок, поищу. Но почему тот же EntityFramework прекрасно подгружается и без таких шагов? Магия? :)
Эта (если я ничего не путаю) сборка входит в состав .NET Framework и зарегистрирована в системе.
Название: Re: Как в сборку для ACAD подключить FontAwesome?
Отправлено: Дмитрий Загорулькин от 23-06-2021, 12:53:51
Но почему тот же EntityFramework прекрасно подгружается и без таких шагов? Магия?
Есть такая беда в Автокаде - плохо цепляет сборки с XAML-зависимостями. То есть, если в XAML-разметке есть код типа:
Код - XML [Выбрать]
  1. pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml
Ну или тому подобные ссылки из XAML на другие сборки.
Поэтому, нужен такой костыль в виде AssemlyResolve.
А EntityFramework цепляется по "обычным" зависимостям .NET. Поэтому, с ним таких проблем и нет.
Название: Re: Как в сборку для ACAD подключить FontAwesome?
Отправлено: Алексей Кулик от 23-06-2021, 12:57:50
О как... Спасибо! :)
Название: Re: Как в сборку для ACAD подключить FontAwesome?
Отправлено: Александр Пекшев aka Modis от 23-06-2021, 12:59:06
Чтобы библиотеки нормально цеплялись они должны лежать в корне папки, в которой расположен acad.exe. Поэтому лучше всегда их загружать принудительно
Название: Re: Как в сборку для ACAD подключить FontAwesome?
Отправлено: Алексей Кулик от 23-06-2021, 13:04:43
Огось! Спасибо ))
Как много нам открытий чудных готовит автодеска дух...
Название: Re: Как в сборку для ACAD подключить FontAwesome?
Отправлено: Дмитрий Загорулькин от 23-06-2021, 13:16:21
Чтобы библиотеки нормально цеплялись они должны лежать в корне папки, в которой расположен acad.exe. Поэтому лучше всегда их загружать принудительно
Ну, для железобетонности, наверное, можно и все и всегда грузить принудительно. Но это накладно. Особенно, когда ты используешь сборку, которая ссылается на другую сборку, а та тянет третью и тд. Подгрузку каждой из них устанешь прописывать... Можно, конечно, сделать универсальный загрузчик. который сканирует всю папку и загружает все dll из неё. Но как-то пока не вижу в этом резона. Да и есть теоретический риск загрузить что-то лишнее, что вызовет другие проблемы.
По моему опыту, проблемы были только с XAML. В остальных случаях DLL рядом корректно находило. Или я ошибаюсь, и с обычными DLL тоже бывали проблемы?
Название: Re: Как в сборку для ACAD подключить FontAwesome?
Отправлено: Александр Ривилис от 23-06-2021, 15:15:16
Или я ошибаюсь, и с обычными DLL тоже бывали проблемы?
У меня такое было с BouncyCastle.Crypto.dll, Ionic.Zip.dll и itextsharp.dll