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

ADN Club => AutoCAD .NET API => Тема начата: Lemieux от 06-04-2020, 19:24:03

Название: System.Windows.Markup.XamlParseException
Отправлено: Lemieux от 06-04-2020, 19:24:03
Всех приветствую.
Кто-нибудь ловил вот такое исключение при вызове модального/не модального окна? Вылетает оно только при работе с автокадом, если загрузить GongSolutions из NuGet или просто добавить как референс. Если просто компилировать оконное приложение, то всё норм.

Код - C# [Выбрать]
  1. System.Windows.Markup.XamlParseException: 'Could not load file or assembly 'GongSolutions.WPF.DragDrop, PublicKeyToken=91f1945125b7a587' or one of its dependencies.

Почему мне нужна эта библиотека? Я пытаюсь сделать окно, которое отображает мой лист выбранных элементов на чертеже и, при этом, я хотел бы их сортировать вручную перетаскиванием. Поиск примеров гугл не даёт результатов по примерам, а мозгов пока не хватает, чтобы разобраться в эвентах и в этой теме https://docs.microsoft.com/ru-ru/dotnet/framework/wpf/advanced/drag-and-drop-overview
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Александр Ривилис от 06-04-2020, 19:39:04
Если просто компилировать оконное приложение, то всё норм.
Потому что эта dll-ка лежит рядом с exe-файлом. С AutoCAD'ом так не получится - нужно его самостоятельно загрузить, так как AutoCAD его не найдёт.
https://docs.microsoft.com/en-us/dotnet/api/system.appdomain.assemblyresolve?view=netframework-4.8
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Александр Ривилис от 06-04-2020, 19:43:05
Аналогичная тема: https://adn-cis.org/forum/index.php?topic=1876.0
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Lemieux от 06-04-2020, 20:57:58
Аналогичная тема: https://adn-cis.org/forum/index.php?topic=1876.0
Большое спасибо за наводку. Понял свою ошибку при поисковом запросе и ничего, пока что, не понял в решении проблемы   :)
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Lemieux от 06-04-2020, 22:00:28
Если я правильно понял, то Автокад хочет, чтобы я помимо сборки моего проекта грузил ему, через команду "NETLOAD", вот эту библиотеку "GongSolutions.WPF.DragDrop", которую я использую в своём проекте? И решение проблемы состоит в том, чтобы отловить событие "AppDomain.AssemblyResolve" и понему автоматически загрузить эту библиотеку?

Просто я у этой библиотеки поставил свойство "Copy Local = True", чтобы не ходить далеко, загрузил вручную её в Автокад, и всё заработало.
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Александр Ривилис от 06-04-2020, 23:03:10
Если я правильно понял, то Автокад хочет, чтобы я помимо сборки моего проекта грузил ему, через команду "NETLOAD", вот эту библиотеку "GongSolutions.WPF.DragDrop", которую я использую в своём проекте? И решение проблемы состоит в том, чтобы отловить событие "AppDomain.AssemblyResolve" и понему автоматически загрузить эту библиотеку?
Нет. Ты понял неправильно. Когда идёт обращение "GongSolutions.WPF.DragDrop" из твоего dll-приложения, .NET Framework пытается его найти и найти не может. Тебе нужно ему подсказать где оно находится, а точнее загрузить его. В принципе ты можешь для начала попробовать загрузить его при помощи Assembly.LoadFile в методе Initialize. Если это не поможет, то в методе Initiliaze подписывайся на событие AssemblyResolve и в нём, если  ResolveEventArgs.Name равно "GongSolutions.WPF.DragDrop", то загружай при помощи Assembly.LoadFile эту сборку и возвращай её из этого события.
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Дмитрий Загорулькин от 07-04-2020, 14:35:49
Хм, так, получается, что это решение может подойти и для этой проблемы: https://adn-cis.org/forum/index.php?topic=7885.0 ?
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Александр Ривилис от 07-04-2020, 14:55:43
Хм, так, получается, что это решение может подойти и для этой проблемы: https://adn-cis.org/forum/index.php?topic=7885.0 ?
Думаю да.
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Lemieux от 07-04-2020, 15:12:52
Я решил проблему, но возник другой вопрос. Когда компилируется проект, то сторонняя библиотека не встраивается в сборку и, если я свою готовую dll перенесу на другой комп, придётся таскать эту библиотеку везде со своим файлом?
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Александр Ривилис от 07-04-2020, 15:15:36
если я свою готовую dll перенесу на другой комп, придётся таскать эту библиотеку везде со своим файлом?
Конечно придётся. Если эта сторонняя библиотека, которой нет ни в AutoCAD, ни среди библиоток .NET Framework.
Я решил проблему
Каким образом?
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Lemieux от 07-04-2020, 15:46:13
Каким образом?
Как Вы подсказали. Попробовал использовать эвент, грузил напрямую
Код - C# [Выбрать]
  1. AssemblyName assemName = AssemblyName.GetAssemblyName("Путь до файла");
  2. AppDomain.CurrentDomain.Load(assemName);
что фактически одно и то же. У меня ещё есть идеи, но как Вы уточнили, всё сводится к сторонним файлам в проекте.

Но если таскать стороннюю библиотеку, то не проще ничего не писать в коде, а разместить стороннюю библиотеку в папке "C:\Program Files\Autodesk\ApplicationPlugins\.bundle" и прописать, что нужно в файле "PackageContents.xml"? Но и этот способ мне не нравится, так как из-за какого-то "перетаскивания" нужно таскать целую библиотеку. Буду пытаться разобраться в работе эвентов, чтобы просто написать своё перетаскивание.
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Александр Ривилис от 07-04-2020, 16:52:48
Но если таскать стороннюю библиотеку, то не проще ничего не писать в коде, а разместить стороннюю библиотеку в папке "C:\Program Files\Autodesk\ApplicationPlugins\.bundle" и прописать, что нужно в файле "PackageContents.xml"?
А причем здесь одно к другому? В коде все-равно придётся писать. И таскать эту стороннюю библиотеку.
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Lemieux от 07-04-2020, 17:23:48
А причем здесь одно к другому? В коде все-равно придётся писать. И таскать эту стороннюю библиотеку.
Так я писал про то, что не проще в своём бандле разместить все необходимые библиотеки, чем писать в коде проверку на подключение модулей или подключать их вручную?

Я вот сейчас проверил, сделал бандл "TEST.bundle", кинул в папку "content" dll моего проекта и dll "GongSolutions.WPF.DragDrop", прописал всё в "PackageContents", и всё заработало без лишних строк в коде проекта.
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Александр Ривилис от 07-04-2020, 17:26:47
Я вот сейчас проверил, сделал бандл "TEST.bundle", кинул в папку "content" dll моего проекта и dll "GongSolutions.WPF.DragDrop", прописал всё в "PackageContents", и всё заработало без лишних строк в коде проекта.
Это работает не всегда и не во всех версиях AutoCAD. Так что рекомендую код загрузки оставить. Он будет срабатывать только если эта библиотека не будет найдена.
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Александр Ривилис от 07-04-2020, 17:34:14
Lemieux,
Стоп! А что ты подразумевал под
прописал всё в "PackageContents"
???
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Lemieux от 07-04-2020, 18:03:42
Lemieux,
Стоп! А что ты подразумевал под
прописал всё в "PackageContents"
???
Файл "PackageContents.xml", с описанием бандла.

https://knowledge.autodesk.com/ru/search-result/caas/CloudHelp/cloudhelp/2017/RUS/AutoCAD-Customization/files/GUID-40F5E92C-37D8-4D54-9497-CD9F0659F9BB-htm.html

Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Александр Ривилис от 07-04-2020, 18:17:24
Файл "PackageContents.xml", с описанием бандла.
Что такое PackageContents.xml я прекрасно знаю уже 9 лет (с момента, когда он появился в AutoCAD 2012). Я имел в виду что именно ты прописал в нём? Уточню вопрос. Ты прописал в <ComponentEntry ...> GongSolutions.WPF.DragDrop ? Теоретически это возможно.
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Lemieux от 07-04-2020, 21:14:44
Ты прописал в <ComponentEntry ...> GongSolutions.WPF.DragDrop ?
Совершенно верно.
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Lemieux от 01-05-2020, 09:31:53
Как я понимаю, если я напишу свою библиотеку классов и буду её подключать, то у меня примерно такая же ошибка будет вылетать и мне надо будет везде таскать свою библиотеку?
Название: Re: System.Windows.Markup.XamlParseException
Отправлено: Lemieux от 01-05-2020, 14:20:12
Как я понимаю, если я напишу свою библиотеку классов и буду её подключать, то у меня примерно такая же ошибка будет вылетать и мне надо будет везде таскать свою библиотеку?
Протестировал - да, такая же проблема, либо я что-то не так делаю. Решил, что пока малое количество наработок буду пользоваться шаблонами итемов visual studio и загружать их в проекты, когда понадобятся.