C# Помещение необходимых DLL где-то, кроме корня вывода
Я использую EmguCV для проекта, и когда наша программа запускается, ей нужны некоторые dll, такие как "cxcore.dll" и т. Д. (Или она генерирует исключения во время выполнения). На данный момент я поместил файлы в корень выходной папки (выбрал "Копировать всегда" в свойствах файла в Visual Studio).
Однако это выглядит немного грязно, чтобы иметь около 10 различных библиотек. Есть ли где-нибудь, где я могу переместить его в подпапку в выходной папке, и он все равно найдет его.
4 ответа
Удивительные ответы до сих пор. Никто не прав;) Ну,
да, вы можете разместить сборки в разных местах.
В соответствующем конфиге приложения (app.config
который копируется в your.exe.config
) добавлять:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="lib" />
</assemblyBinding>
</runtime>
В соответствии с:
http://msdn.microsoft.com/en-us/library/823z9h8w.aspx
Это заставит программу искать закрытые пути (папки в своей собственной папке) для сборок - так же, как веб-приложение ищет /bin.
Вы также можете поместить их в GAC, но этого следует избегать, если нет других причин для этого.
Это, как говорится, вам действительно не нужно. Пользователи не запутаются, если вы правильно установите приложение в меню "Пуск";) У меня никогда не было такой проблемы, включая проекты с более чем 50 сборками. Пользователи simlpy никогда их не видят.
Чтобы получить сборки в подкаталоге, вы можете скопировать их туда вручную, использовать событие до или после сборки или что-то совершенно другое.
Чтобы загрузить их, вы можете использовать событие AppDomain.AssemblyResolve или (как отмечает TomTom) <probing>
Элемент Из MSDN:
В следующем примере показано, как указать базовые подкаталоги приложений, в которых среда выполнения должна искать сборки.
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>
GAC - это, конечно, еще одно место для выгрузки ваших сборок, но это на самом деле не считается подкаталогом... если вы не установите свое приложение где-то, его действительно не следует устанавливать:P
Вы можете скопировать dll в нужное вам место, используя события до / после сборки, и макросы, сообщающие вам, где находится ваша выходная папка.
Но, если DLL не находятся в том же каталоге, что и исполняемый файл, они не будут загружены. Если они управляются, вы можете загрузить их вручную, используя методы Assembly.Load. Если они неуправляемые, я не знаю, как вы можете это сделать.
Вы можете сохранить это в другом месте и все еще связать это. В свойствах ссылки установите для параметра "Копировать локальный" значение false и укажите путь соответствующим образом. Это будет работать Если предполагается, что внешние библиотеки DLL изменят версию, вы можете установить для "Определенной версии" значение false, чтобы иметь возможность связываться с любой версией.