Этот вопрос уже имеет ответ здесь:
Я использую EmguCV для проекта и когда наши прогоны программы, требуется некоторый dlls как "cxcore.dll" и т.д. (или он выдает исключения на этапе выполнения). В данный момент я поместил файлы в корень выходной папки (выбранная "Копия Всегда" в свойствах файла в Visual Studio).
Однако это выглядит немного грязным, чтобы иметь приблизительно 10 различных dlls просто там. Есть ли некоторым образом, куда я могу переместить его в подпапку в выходной папке, и это все еще найдет его.
Пока потрясающие ответы. Ни в коем случае;) Ну
да, сборки можно разложить по разным локациям.
В конфигурации соответствующего приложения ( 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+ сборками.Пользователи просто никогда их не видят.
Чтобы получить сборки в подкаталоге, вы можете скопировать их туда вручную, использовать событие до или после сборки или что-то совершенно другое.
Чтобы загрузить их, вы можете использовать событие AppDomain.AssemblyResolve или (как отмечает TomTom ) элемент
. Из MSDN:
В следующем примере показано, как указать базовые подкаталоги приложения, в которых среда выполнения должна искать сборки.
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>
GAC - это, конечно, еще одно место для дампа ваших сборок, но это не будет считаться подкаталогом ... если вы не установите свое приложение где-нибудь, его действительно не следует устанавливать: P
{{ 1}}Вы можете скопировать DLL в нужное место, используя события до / после сборки и макросы, которые сообщают вам, где находится ваша выходная папка.
Но если библиотеки DLL находятся не в том же каталоге, что и исполняемый файл, они не будут загружены. Если они управляются, вы можете загрузить их вручную с помощью методов Assembly.Load. {{ 1}} Если они неуправляемые, я не знаю, как это сделать.
Вы можете сохранить его в другом месте и при этом связать его. В свойствах ссылки установите для параметра «Копировать локальное» значение false и установите соответствующий путь. Это сработает. Если предполагается, что внешние библиотеки DLL изменят версию, вы можете установить для параметра «Определенная версия» значение false, чтобы иметь возможность ссылаться на любую версию.