WinSxS: как получить зависимость от конкретной версии gdiplus.dll?

Мне нужно добавить зависимость от конкретной версии GDIPlus. Это версия GDI+, которую я хочу:

http://i31.tinypic.com/2qiv57t.jpg

Я хочу быть уверен, что я использую эту версию по конкретной причине совместимости.

Я добавил сборочный манифест в мой исполняемый файл, определяя зависимость от версии GdiPlus:

<dependency>
   <dependentAssembly>
      <assemblyIdentity 
            type="win32" name="Microsoft.Windows.GdiPlus" 
            pubicKeyToken="6595b64144ccf1df" 
            version="5.1.3102.2180" processorArchitecture="x86"
            language="*" />
   </dependentAssembly>
</dependency>

За исключением случаев, когда я запускаю свое приложение, загрузчик fusion для Windows предоставляет мне другую версию gdiplus.dll из папки Side-by-Side, которую я вижу в Process Explorer:

http://i29.tinypic.com/hrwitz.jpg

Это дает мне версию 5.02.6002.18005, а не 5.1.3102.2180.

Итак, вопрос: как мне взять зависимость от конкретной версии Windows DLL?

1 ответ

Ваша "проблема", такая, что это так, заключается в том, что установлен файл политики, который указывает, что запросы для 5.1.3102.2180 могут быть перенаправлены на 5.02.6002.18005

Обычно это хорошая вещь. это позволяет приложениям указывать версию, против которой они были собраны, в своем манифесте, но когда вводятся критические исправления безопасности, ОС может перенаправлять приложения на совместимые версии.

Итак, что здесь произойдет, ваше приложение будет связываться с GDI+ 5.1 на любом ПК, на котором установлена ​​только 5.1. но любые компьютеры с 5.2 GDI+, вы будете перенаправлены на это.

Если у вас есть веская причина, по которой вы хотите использовать 5.1, даже если 5.2 доступен... Я думаю, вы можете использовать файл конфигурации приложения для управления этим.

Создайте файл с именем yourapp.exe.config - если модуль в вашем приложении, импортирующий GDI +, является dll, то это будет DLL.dll.2.config.

Однако я не уверен, как структурировать bindingRedirect. т.е. с учетом перенаправления файлов политики, я не уверен, нужно ли вам перенаправить старую версию обратно к себе, или новую версию обратно к старой версии. или что. Может потребоваться некоторое количество проб и ошибок.

Данные в файле.config выглядят почти так же, как данные в файле манифеста. Примерно так (который имитирует почти точно содержимое файла политики, установленного в winsxs, и выполняет перенаправление, которое вам не нужно).

<configuration>
  <windows>
    <assemblyBinding xmlns=...>
      <dependentAssembly name="GdiPlus...>
        <bindingRedirect oldVersion="5.1.x.x" newVersion="5.1.x.x"/>

Чтобы упростить выбор "oldVersion", он поддерживает синтаксис диапазона. так

oldVersion="5.0.0.0-5.3.0.0"

было бы простым способом гарантировать, что весь диапазон версий GdiPlus будет перенаправлен к определенной версии.

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