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

ADN Club => Другие продукты Autodesk => Navisworks API => Тема начата: Vladislav от 05-06-2020, 22:29:00

Название: Загрузка dll-внутри плагина
Отправлено: Vladislav от 05-06-2020, 22:29:00
Добрый вечер! Такой вопрос.
В своем плагине я использую много вспомогательных dll(как управляемых, так и нативных).
Я хочу чтобы всё находилось в одной папке (dll плагина и вспомогательные dll).
C:\Program Files\Autodesk\Navisworks Manage 2019\Plugins\MyPlugin.
Но по умолчанию Нэвис ищет все вспомогательные dll в своем корневом каталоге.
Как мне это изменить?
Внутри метода Execute не получается, потому что исключение выбрасывается раньше его первой команды.
Спасибо.
Название: Re: Загрузка dll-внутри плагина
Отправлено: Александр Ривилис от 05-06-2020, 23:28:09
Внутри метода Execute не получается, потому что исключение выбрасывается раньше его первой команды.
В какой момент выбрасывается исключение?
Название: Re: Загрузка dll-внутри плагина
Отправлено: Vladislav от 06-06-2020, 00:12:35
Я и сам не пойму. В сообщении написано, что оно в Autodesk.Navisworks.Api.dll.
До точки останова на первой команде метода Execute почему-то не доходит.
Название: Re: Загрузка dll-внутри плагина
Отправлено: Александр Ривилис от 06-06-2020, 00:15:27
Я и сам не пойму. В сообщении написано, что оно в Autodesk.Navisworks.Api.dll.
До точки останова на первой команде метода Execute почему-то не доходит.
Сообщение какое? Полностью текст и картинку.
Название: Re: Загрузка dll-внутри плагина
Отправлено: Vladislav от 06-06-2020, 00:32:21
Вот оно
Название: Re: Загрузка dll-внутри плагина
Отправлено: Александр Ривилис от 06-06-2020, 10:52:23
На вскидку я вижу такое решение:
1. Пишешь плагин-заглушку, который выполняет следующие действия:
2. Находит каталог, в котором он размещен
3. Загружает все вспомогательные dll из каталога и основной плагин. Вполне возможно, что придётся подписаться на событие AssemblyResolve и написать свой обработчик для него: https://docs.microsoft.com/en-us/dotnet/standard/assembly/resolve-loads
4. Запускает метод Execute твоего основного плагина.
Название: Re: Загрузка dll-внутри плагина
Отправлено: ivmax от 13-10-2020, 09:59:11
Vladislav, подскажите, удалось ли вам решить вашу проблему, если да, то каким именно способом?
Название: Re: Загрузка dll-внутри плагина
Отправлено: Александр Ривилис от 13-10-2020, 10:40:41
ivmax,
Моей подсказки оказалось недостаточно?
Название: Re: Загрузка dll-внутри плагина
Отправлено: ivmax от 13-10-2020, 11:09:44
Александр,
вашу подсказку мне не удалось реализовать, потому что я не понимаю как это сделать :). Предположил что у Vladislavа есть готовое решение и возможно он им поделится.
Название: Re: Загрузка dll-внутри плагина
Отправлено: Александр Ривилис от 13-10-2020, 11:15:13
вашу подсказку мне не удалось реализовать, потому что я не понимаю как это сделать :).
Что именно не удалось понять?
Название: Re: Загрузка dll-внутри плагина
Отправлено: ivmax от 13-10-2020, 11:34:32
вашу подсказку мне не удалось реализовать, потому что я не понимаю как это сделать :).
Что именно не удалось понять?
п2. понятно;
п3. загрузка сборок, предполагаю, происходит методом LoadFrom. Как использовать AssemblyResolve я не понял;
п4. понял только сейчас, что нужно использовать Reflection, верно?


Название: Re: Загрузка dll-внутри плагина
Отправлено: Александр Ривилис от 13-10-2020, 11:42:13
п3. загрузка сборок, предполагаю, происходит методом LoadFrom. Как использовать AssemblyResolve я не понял;
Вот приблизительно так: https://adndevblog.typepad.com/autocad/2014/01/pnp3dobjectsmgd-not-found-exception.html
п4. понял только сейчас, что нужно использовать Reflection, верно?
Можно и через Reflection.