Манифест. Ошибка выполнения бинарника в релизной версии

Я разрабатываю двоичный файл в Windows XP с помощью Visual Studio 2005. Я создал отладочную и выпускную версии своего приложения, и на моей машине все идет нормально. Но когда я пытаюсь запустить приложение на другом компьютере, отладочная версия работает нормально (я думаю, потому что у меня одна и та же Visual Studio на обеих машинах), но у выпуска есть проблемы с выполнением (у меня такая же версия распространяемых файлов) . Читая здесь, в Stackoverflow, я установил для встроенного манифеста значение no, и когда я создаю свое приложение, я вижу свой манифест выпуска, и его содержание таково:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

  <dependency>

    <dependentAssembly>

      <assemblyIdentity type="win32"
       name="Microsoft.VC80.CRT" 
       version="8.0.50727.762" 
       processorArchitecture="x86" 
       publicKeyToken="1fc8b3b9a1e18e3b">
      </assemblyIdentity>

    </dependentAssembly>

  </dependency>

  <dependency>

    <dependentAssembly>

      <assemblyIdentity type="win32" 
       name="Microsoft.VC80.MFC" 
       version="8.0.50727.762" 
       processorArchitecture="x86" 
       publicKeyToken="1fc8b3b9a1e18e3b">
      </assemblyIdentity>

    </dependentAssembly>

  </dependency>

  <dependency>

    <dependentAssembly>

      <assemblyIdentity type="win32" 
       name="Microsoft.VC80.CRT" 
       version="8.0.50727.4053" 
       processorArchitecture="x86" 
       publicKeyToken="1fc8b3b9a1e18e3b">
      </assemblyIdentity>

    </dependentAssembly>

  </dependency>

</assembly>

Если я удалю последнюю запись 8.0.50727.4053 в манифесте конечной машины, я смогу успешно запустить приложение, но почему эта запись добавляется в манифест? Как я могу удалить его?

С Уважением


person opernas    schedule 24.03.2011    source источник


Ответы (2)


Манифесты — это решение Microsoft для их DLL-ада. Существует одна запись (имя библиотеки, версия) для каждой библиотеки, используемой вашей программой, чтобы Windows могла загрузить правильную версию.

Об удалении:

Вы можете попробовать, если ваша версия VS имеет возможность статически связать библиотеки MFC и CRT с исполняемым файлом. Затем эти элементы должны исчезнуть из манифеста.

Если вы не можете выполнить статическую компоновку и у вас есть полный контроль над средой выполнения, вы можете просто отправить продукт без файла .manifest. Когда вы не можете контролировать свою среду runitme, лучше создать установщик для вашего приложения, который объединяет необходимые библиотеки.

person Rudi    schedule 24.03.2011
comment
да, но что я могу сделать, чтобы удалить эту запись 8.0.50727.4053 из манифеста? и почему мое приложение работает без этой записи??? - person opernas; 24.03.2011

Когда вы создаете проект в VS2005 с помощью среды выполнения DLL, компилятор автоматически включает информацию, которая используется для добавления записей dependAssembly в окончательный манифест.

То, что здесь происходит, вероятно, вызвано тем, что вы включили проект статической библиотеки, созданный с помощью VS2005 RTM, и теперь вы пытаетесь создать проект с использованием VS2005 SP1.

Ваши решения:

  • Перестройте статические библиотеки в своем проекте с помощью самой последней версии VS2005, чтобы все зависимые сборки указывали на одну и ту же самую последнюю версию.

  • Перестройте только свой EXE-файл с параметрами, позволяющими принудительно ссылаться на среду выполнения RTM. Инструкции находятся здесь

  • Полностью отключите автоматические манифесты и просто отправьте вручную созданный манифест только с одной ссылкой на CRT dependAssembly, которая является вашей предпочтительной версией CRT.

person Chris Becke    schedule 24.03.2011