Направление приложения VC ++ на использование более старой версии VC80.CRT - PullRequest
1 голос
/ 16 января 2010

У меня есть приложение, управляемое VC ++, которое было создано и протестировано на VC80.CRT версии 8.0.50727.762. Я проверил, что встроенный манифест указывает на 762, а на машине сборки установлена ​​762 как последняя версия VC80.CRT.

Приложение теперь также запускается на компьютере с 762 и более поздней версией среды выполнения (4053).

Обе машины, кстати, являются XP Pro SP2; вторая машина (так сказать 4053) имеет .NET 3.0.

Приложение работает на компьютере 4053, и я думаю, что я понимаю, что из-за политики издателя, которая сопровождает VC80.CRT под SxS, приложение загружает для приложения 4053, а не 762.

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

В любом случае, после изучения литературы, мне кажется, я понимаю цепочку, которая определяет целевую версию для загрузки: конфигурация приложения -> политика издателя -> конфигурация компьютера.

Итак, я подошел к размещению файла myapp.exe.config (см. Ниже) рядом с myapp.exe; обратите внимание на настройку publisherPolicy со значением «нет», чтобы избежать второго шага создания цепочки.

Приложение по-прежнему загружает 4053, а не 762. Возможно, это из-за того, что говорит файл конфигурации машины, но я даже не могу понять, что должно означать содержимое этого файла - конечно, нет никакого ссылка на VC80.CRT или любую из библиотек msvc [x] 80.dll там.

Я ожидал, что ссылаться на более старую версию сборки было бы относительно легко, так как это ключ к преодолению «дьявольского ада» - даже если издателю сборки хочется гарантировать обратную совместимость (через политику издателя).
Кто-нибудь может пролить свет? Спасибо

<configuration>
    <runtime>    
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">
                 </assemblyIdentity>
                 <publisherPolicy apply="no" />
                 <bindingRedirect oldVersion="*" newVersion="8.0.50727.762"/>
             </dependentAssembly>
         </assemblyBinding>
   </runtime>
</configuration>

Ответы [ 2 ]

1 голос
/ 30 июня 2010

Тег <runtime> предназначен для зависимостей CLR. Используйте <windows> для родного SxS. Кроме того, я не верю, что есть конфигурация машины для SxS, только для GAC / CLR.

Смотрите мой ответ на мой связанный вопрос: Как заставить родное приложение использовать более старую среду выполнения C

1 голос
/ 01 марта 2010

Machine.config для приложений .NET. Собственная конфигурация SxS находится в каталоге WinSxS .

Есть ли в вашем EXE встроенный манифест? Начиная с XP SP2 (я думаю) они имеют приоритет над внешними (foo.exe.manifest) файлами.

...