C# Помещая необходимый DLLs где-нибудь кроме корня вывода [дубликат]

Этот вопрос уже имеет ответ здесь:

Я использую EmguCV для проекта и когда наши прогоны программы, требуется некоторый dlls как "cxcore.dll" и т.д. (или он выдает исключения на этапе выполнения). В данный момент я поместил файлы в корень выходной папки (выбранная "Копия Всегда" в свойствах файла в Visual Studio).

Однако это выглядит немного грязным, чтобы иметь приблизительно 10 различных dlls просто там. Есть ли некоторым образом, куда я могу переместить его в подпапку в выходной папке, и это все еще найдет его.

28
задан Aishwar 15 March 2010 в 07:01
поделиться

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+ сборками.Пользователи просто никогда их не видят.

64
ответ дан 28 November 2019 в 02:34
поделиться

Чтобы получить сборки в подкаталоге, вы можете скопировать их туда вручную, использовать событие до или после сборки или что-то совершенно другое.

Чтобы загрузить их, вы можете использовать событие 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}}
21
ответ дан 28 November 2019 в 02:34
поделиться

Вы можете скопировать DLL в нужное место, используя события до / после сборки и макросы, которые сообщают вам, где находится ваша выходная папка.

Но если библиотеки DLL находятся не в том же каталоге, что и исполняемый файл, они не будут загружены. Если они управляются, вы можете загрузить их вручную с помощью методов Assembly.Load. {{ 1}} Если они неуправляемые, я не знаю, как это сделать.

-2
ответ дан 28 November 2019 в 02:34
поделиться

Вы можете сохранить его в другом месте и при этом связать его. В свойствах ссылки установите для параметра «Копировать локальное» значение false и установите соответствующий путь. Это сработает. Если предполагается, что внешние библиотеки DLL изменят версию, вы можете установить для параметра «Определенная версия» значение false, чтобы иметь возможность ссылаться на любую версию.

-3
ответ дан 28 November 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: