Могу ли я изменить последовательность поиска параллельной сборки?

У меня есть программный проект для Windows, C++ (построенный с Visual Studio 2005, SP1), который имеет следующую (упрощенную) структуру файла:

{App. Root Directory}
|-- bin
|   |-- Microsoft.VC80.CRT
|   +-- Microsoft.VC80.MFC
+-- utils

Существуют различные исполняемые файлы, которые находятся в каталогах bin и utils. Каждый из этих исполняемых файлов опирается на параллельную сборку (C++ DLL времени выполнения), которую мы храним в bin, но мы разделили их в эти отдельные папки по разным причинам (например, exes в папке utils являются дополнительными инструментами к нашему основному приложению, и запускаются нечасто). Непосредственным результатом этой файловой организации является то, что приложения в папке utils не запускаются в системах, в которых еще не установлена ​​соответствующая параллельная сборка (они терпят неудачу при обычном "Система не может выполнить указанную программу"). сообщение об ошибке).

Мой вопрос: есть ли способ сказать приложениям в папке utils явно посмотреть в ..\bin папка для соответствующей параллельной сборки? В статье " Последовательность поиска сборки" в Microsoft ничего не говорится о том, возможно это или нет. Есть ли умный способ исправить это требование времени выполнения для этих приложений?

Потенциальные варианты, которые я вижу:

  1. Поместите копию параллельной сборки в папку utils. Это может быть сделано во время выполнения (чтобы предотвратить вздутие пакета установки нашего приложения), но кажется немного грязным.
  2. Статически связать исполняемые библиотеки DLL. Я не хочу этого делать!
  3. Пусть конечный пользователь установит обычный распространяемый пакет. Я бы тоже не стал этого делать.

1 ответ

Решение

Мой первый ответ: какая реальная выгода получается от отделения коммунальных услуг от .\bin папка? Имея тенденции OCD, я понимаю смысл аккуратности, но продолжать практику, как только можно заметить, что это отрицательно влияет на вашу способность развертывать приложение, кажется немного бессмысленным.

Тем не менее, это на самом деле технически возможно. Для этого вы используете пробный элемент privatePath в вашем файле app.config. Конфигурационные файлы приложения работают аналогично манифестам приложения, за исключением того, что их нельзя внедрить в качестве ресурсов: создайте файл в той же папке, что и exe, с полным именем exe (включая расширение exe) и добавьте .config,

<!-- acme.exe.config -->
<configuration>   
  <windows>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="bin;..\bin" />
    </assemblyBinding>
  </windows>
</configuration>

Существует ряд предостережений, которые делают это решение потенциально неработоспособным - любые библиотеки DLL, которые указывают свои собственные зависимые сборки, должны иметь файл конфигурации приложения с probing privatePath элемент. Также поддержка для probing узел был добавлен только в Windows NT 6.0 (Vista), поэтому это решение не подходит, если вам все еще нужно ориентироваться на XP.

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