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, чтобы иметь возможность связываться с любой версией.

Другие вопросы по тегам