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

ADN Club => Revit API => Тема начата: Vladislav от 04-03-2019, 15:54:19

Название: Пути поиска dll в Revit
Отправлено: Vladislav от 04-03-2019, 15:54:19
Добрый день.
Возник следующий вопрос. В своем плагине я опосредовано использую ряд неуправляемых библиотек (они используются через управляемые обертки).
Всё хорошо работает, но есть нюанс. Эти неуправляемые библиотеки должны лежать строго в корневой папке Revit.
Мне же хотелось бы поместить их в папку AddIns либо еще куда-то.
В связи с этим вопрос. Можно ли как-то, использую Revit API, изменить путь, по которому Revit ищет dll?
Благодарю за ответы и информацию.
Название: Re: Пути поиска dll в Revit
Отправлено: Александр Пекшев aka Modis от 04-03-2019, 15:56:55
Можно ли как-то, использую Revit API, изменить путь, по которому Revit ищет dll?
Нет конечно
Мне же хотелось бы поместить их в папку AddIns либо еще куда-то.
В своем плагине грузите нужные вам библиотеки (до первого их вызова) через Assembly.LoadFrom() и не важно тогда где они лежат
Название: Re: Пути поиска dll в Revit
Отправлено: Vladislav от 04-03-2019, 16:01:28
Таким методом можно грузить и неуправляемые dll?
Название: Re: Пути поиска dll в Revit
Отправлено: Александр Пекшев aka Modis от 04-03-2019, 16:04:26
Таким методом можно грузить и неуправляемые dll?
Вот тут не скажу точно. Нужно читать MSDN или подождать ответа того, кто более в теме. Ну или просто попробовать. Мне кажется, что должно сработать
То, что либы ищутся рядом - это вообще к Ревиту не относится - это так работает CLR. Кстати, через файл конфигурации можно переносить зависимые либы в подпапку той же папки
Название: Re: Пути поиска dll в Revit
Отправлено: Александр Игнатович от 04-03-2019, 16:50:39
В своем плагине грузите нужные вам библиотеки (до первого их вызова) через Assembly.LoadFrom() и не важно тогда где они лежат

В качестве альтернативы можно подписаться на событие AppDomain.CurrentDomain.AssemblyResolve

Только это всё для управляемого кода.

Как сделана managed-обёртка у Вас я не в курсе. Если работаете с помощью DllImport, то можно в конструктор можно передать полный путь к dll-ке, либо вот как в MSDN:
Цитировать
If an unmanaged DLL file is included in an assembly, for example, by using the linker or the /linkresource compiler option, you can specify the assembly display name as part of dllName. For example, if an unmanaged DLL named unmanaged.dll is included in a managed assembly named MyAssembly, the attribute might be specified as shown in the following code:

Код - C# [Выбрать]
  1. [DllImport("unmanaged.dll, MyAssembly, Version= 1.0.0.0," +
  2.  "Culture=neutral, PublicKeyToken=a77e0ba5eab10125")]
  3. static extern int SomeFuncion1(int parm);