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