С# Помещение необходимых 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, чтобы иметь возможность ссылаться на любую версию.