Поделиться через


Устранение неполадок в изолированных приложениях и параллельных сборках C/C++

Приложения A.C. /C C-++ загрузки может завершиться неудачей, если зависимые библиотеки не найден.В этом разделе описываются некоторые основные причины, по которым приложение A.C. /C C-++ не удается загрузить, а также шаги для решения проблемы.

Если приложение не удается загрузить, поскольку он содержит манифест, который определяет зависимость от параллельной сборки и сборки не задано как закрытая сборка в той же папке, что и исполняемый файл, ни в собственном кэше сборок в папке %WINDIR% \ WinSxS \, одно из сообщений об ошибке может отображаться в зависимости от версии Windows, в которой требуется выполнить приложение.

  • Приложение не не удалось инициализировать правильно (0xc0000135).

  • Это приложение не удалось запустить, поскольку неправильной конфигурации приложения.Переустановка приложения может разрешить эту проблему.

  • Система не может быть выполнена определенная программа.

Если приложение не имеет манифеста сборки и зависит от библиотеки DLL, Windows может найти в обычных местах поиска, сообщение об ошибке, имеет следующий вид одно может отображаться:

  • Это приложение не удалось запустить, поскольку необходимое библиотеки DLL не найдено.Повторная установка приложения может решить данную проблему.

Если приложение развертывается на компьютере, на котором не установлены Visual Studio, а также сбой с сообщениями об ошибках, похожие на предыдущие один, проверьте следующие действия:

  1. Выполните действия, описанные в разделе Основные сведения о зависимостях приложения Visual C++.С помощью иллюстратора функциональных зависимостей можно просмотреть большинство зависимостей для приложения или библиотеку DLL.При мониторинге, что некоторые библиотеки DLL отсутствует, добавьте их на компьютере, на котором выполняется попытка запустить приложение.

  2. Загрузчик операционной системы использует манифест приложения, чтобы сборки, от которых зависит от приложения.Манифест можно внедрить в бинарный как ресурс, или задает в отдельный файл в папке приложения.Чтобы проверить внедрены ли манифест в бинарный, откройте бинарный в Visual Studio и найдите RT_MANIFEST в списке ресурсов.Если не удается найти внедренный манифест, откройте в папке приложения с именем файла, аналогичный <binary_name>.<extension>.manifest.

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

  4. Если манифест внедряется в бинарный, убедитесь, что идентификатор RT_MANIFEST вставки этого типа бинарный.Дополнительные сведения о том, какое идентификатор ресурсов см. в разделе Использование стороны - символом - нескольких версий сборки в качестве ресурса (Windows)Если манифест в отдельном файле, откройте его в редакторе XML или в текстовом редакторе.Дополнительные сведения о манифестах и правилах развертывания см. в разделе Манифесты.

    ПримечаниеПримечание

    Если и внедренный манифест и отдельного файла манифеста присутствуют, загрузчик операционной системы использует внедренный манифест и игнорирует отдельный файл.Однако в Windows XP, то используется значение true - отдельный файл манифеста и внедренный манифест игнорируется.

  5. Рекомендуется внедрить этот манифест в каждом библиотеки DLL, поскольку внешние манифесты не используются, когда библиотека DLL загружается через вызов LoadLibrary.Дополнительные сведения см. в разделе Манифесты сборок.

  6. Убедитесь, что все сборки, перечисленных в манифесте правильно установлены на компьютере.Каждая сборка определена в манифесте ее имя, номер версии и архитектурой процессора.Если приложение зависит от параллельных сборок, убедитесь, что эти сборки правильно установлены на компьютере, чтобы загрузчик операционной системы может найти их, как описано в разделе Сборка последовательность выполнения.Необходимо помнить о том, что 64-разрядные сборки невозможно загрузить в 32-разрядный процесс и использовать в 32-разрядных операционных системах.

Пример

Предположим, имеется приложение appl.exe, который построен с помощью Visual C++.Манифест приложения, внедренный в appl.exe, как бинарный ресурса RT_MANIFEST с идентификатором одинаковое значение 1 или сохраняются как appl.exe.manifest отдельного файла.Содержимое этого манифеста, выглядит следующим образом:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Fabrikam.SxS.Library" version="2.0.20121.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

В загрузчик операционной системы, этот манифест информирует appl.exe зависит от сборке Fabrikam.SxS.Library, версии, 2.0.20121.0, созданной для 32 разрядной процессора архитектуры x86.Сборка зависимого параллельно установлены или как общая сборка или как закрытая сборка.

Манифест сборки общие сборки устанавливается в %WINDIR% \ WinSxS \ манифестах папку \.Он определяет сборку и выводит его содержимое-, что библиотеки DLL, которые являются частью сборки.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <noInheritable/>
   <assemblyIdentity type="win32" name="Fabrikam.SxS.Library" version="2.0.20121.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"/>
   <file name="Fabrikam.Main.dll" hash="3ca5156e8212449db6c622c3d10f37d9adb1ab12" hashalg="SHA1"/>
   <file name="Fabrikam.Helper.dll" hash="92cf8a9bb066aea821d324ca4695c69e55b2d1c2" hashalg="SHA1"/>
</assembly>

Параллельные сборки могут также использовать называемый файлы конфигурации издателя— как политика файл- к глобально перенаправляет приложения и сборки использования одной версии параллельной сборки вместо другой версии той же сборки.Можно проверить политики для общих сборок в %WINDIR% \ WinSxS \ политиках папку \.Ниже приведен пример файла политики:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

   <assemblyIdentity type="win32-policy" name="policy.2.0.Fabrikam.SxS.Library" version="2.0.20121.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"/>
   <dependency>
      <dependentAssembly>
         <assemblyIdentity type="win32" name="Fabrikam.SxS.Library" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"/>
         <bindingRedirect oldVersion="2.0.10000.0-2.0.20120.99" newVersion="2.0.20121.0"/>
      </dependentAssembly>
   </dependency>
</assembly>

Этот файл политики указывает, что все приложения или сборку, 2.0.10000.0 просят версия этой сборки вместо этого следует использовать версию 2.0.20121.0, текущая версия, которая задается в системе.Если версия сборки, упомянута в манифесте приложения определяется в файле политики, загрузчик ищет версия этой сборки, указанной в манифесте в папке %WINDIR% \ WinSxS \, и если эта версия не задана, то загрузка завершится ошибкой.А версия сборки 2.0.20121.0 не задана, нагрузка сбое для приложений, 2.0.10000.0 просят версия сборки.

Однако сборку можно также установить в качестве частной параллельной сборки устанавливается в папку приложения.Если операционная система не удается найти сборку как общая сборка, он ищет его в качестве закрытая сборка, в следующем порядке:

  1. Проверьте папку приложения для файла манифеста, имеет имя <assemblyName>.manifest.В этом примере, загрузчик пытается найти Fabrikam.SxS.Library.manifest в папке, содержащей appl.exe.При обнаружении манифест, загрузчик загружает сборку из папки приложения.Если сборка не обнаружена, загрузка завершится ошибкой.

  2. Пытается открыть \<assemblyName>\ в папке, содержащей appl.exe и если \<assemblyName>\ существует, необходимо попытаться загрузить файл манифеста, имеет имя <assemblyName>.manifest из этой папки.Если манифест найден, загрузчик загружает сборку из \<assemblyName>\.Если сборка не обнаружена, загрузка завершится ошибкой.

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

См. также

Основные понятия

Основные понятия, связанные с изолированными приложениями и параллельными сборками

Другие ресурсы

Построение изолированных приложений и параллельных сборок C/C++