Compartilhar via


Solucionando problemas de C/C ++ isolada de aplicativos e assemblies lado a lado

Carregar um aplicativo C/C ++ pode falhar se dependentes Visual C++ bibliotecas não foi encontradas. Uma lista de possíveis erros em tempo de execução pode ser encontrada em Redistribuindo arquivos do Visual C++. Nesta seção são descritas as razões mais comuns para um aplicativo C/C ++ Falha ao carregar, com etapas propostas para resolver os problemas.

Se um aplicativo é implantado em um computador sem o Visual C++ instalado e ele falha com mensagens de erro semelhantes àquelas listadas no Redistribuindo arquivos do Visual C++, várias coisas que precisa ser verificados para entender o motivo para o erro.

  1. Siga os passos descritos em Noções básicas sobre dependências de um aplicativo Visual do C++.O movimentador de dependência pode mostrar a maioria das dependências de qualquer aplicativo específico ou DLL.Se você vir que algumas DLLs estão faltando, instale as DLLs no computador no qual você está tentando executar o aplicativo.

  2. Um manifesto é usado pelo carregador do sistema operacional para carregar módulos (assemblies) que depende de seu aplicativo.Ele pode ou ser incorporado dentro de binário sistema autônomo um recurso ou salvo sistema autônomo um arquivo externo na pasta local do aplicativo.Para verificar se o manifesto incorporado o binário em aberto o binário no Visual Studio e navegue por meio de recursos deste binário. Você poderá encontrar um recurso chamado RT_MANIFEST.Se você não conseguir localizar um manifesto incorporado dentro do binário, procure um arquivo externo denominado algo como <binary_name>. <extensão>.manifest.

  3. Se um manifesto não estiver presente, você precisará garantir que o vinculador gera um manifesto para seu projeto.Você precisa verificar a opção de vinculador Gerar manifesto in the Propriedades do projeto da caixa de diálogo para este projeto.

    Observação:

    B uilding Visual C++ Não há suporte para projetos sem geração de manifesto. Qualquer programa do C/C ++ criado em Visual C++ 2005 tem de incluir um manifesto descrevendo suas dependências em bibliotecas do Visual C++.

  4. Se o manifesto incorporado o binário, verifique se o ID de RT_MANIFEST está correto para esse tipo de binário.Para aplicativos, o ID deve ser igual a 1, para a maioria das DLLs ID deve ser igual a 2.Se o manifesto é em um arquivo externo, abra-o em um editor XML ou editor de texto.Para obter mais informações sobre manifestos e regras para implantação, consulte Manifestos.

    Observação:

    O n o Windows XP, se um manifesto externo está presente na pasta local do aplicativo, o carregador do sistema operacional usa esse manifesto em vez de um manifesto incorporado dentro de binário.On Windows Server 2003 e versões posteriores do Windows, o oposto é verdadeiro — o manifesto externo será ignorado e o manifesto incorporado é usado quando presente.

  5. É recomendável que todas as DLLs têm um manifesto incorporado dentro de binário.Manifestos externos são ignorados quando uma DLL é carregada no entanto um LoadLibrary Chame. Para obter mais informações, consulte Manifestos de assembly.

  6. Verifique se todos os assemblies enumerados no manifesto estão instalados corretamente no computador.Cada assembly é especificado no manifesto por seu nome, arquitetura de processador e o número de versão.Se seu aplicativo depende de conjuntos lado a lado, verifique se esses assemblies estão instalados no computador corretamente, portanto, eles podem ser encontrados pelo carregador do sistema operacional usando as etapas especificadas em sequência de pesquisa de assembly.Lembre-se de que os assemblies de 64 bit não podem ser carregados nos processos de 32 bit e não podem ser executados em sistemas operacionais de 32 bit.

Exemplo

Suponha que temos um aplicativo, appl.exe, criado com Visual C++ 2005. Este aplicativo tem seu manifesto que APPL.exe seja incorporada sistema autônomo um recurso binário RT_MANIFEST com ID igual a 1 ou armazenado sistema autônomo um arquivo externo, appl.exe.manifest.O conteúdo do manifesto de pode ser algo assim:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.xxxxx.y" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

Para o sistema operacional carregador que esse manifesto diz que appl.exe depende de um assembly chamado Microsoft.VC90.CRT, versão 9.0.xxxxx.y e criado para 32 bit x86 a arquitetura do processador.

O conjunto lado a lado dependente pode ser instalado sistema autônomo um assembly compartilhado ou sistema autônomo um assembly particular.Por exemplo, Visual Studio 2005 o conjunto do CRT é instalado sistema autônomo um assembly lado a lado compartilhado que pode ser encontrado no %WINDIR%\WinSxS\x86_Microsoft.VC90.CRT_ diretório<versão> quando executando o Windows XP ou no diretório %WINDIR%\winsxs\x86_microsoft.vc90.crt_<versão> ao executar o Windows Vista.

The assembly manifest para um compartilhado CRT C++ Visual conjunto também é instalado no %WINDIR%\WinSxS\Manifests\x86_microsoft.vc90.crt_<versão>.manifesto quando executando o Windows XP ou no %WINDIR%\winsxs\Manifests\x86_microsoft.vc90.crt_<versão> .manifesto ao executar o Windows Vista e ele identifica este assembly e lista seu Sumário (DLLs que fazem parte deste assembly):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright © 1981-2001 Microsoft Corporation -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <noInheritable/>
   <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.xxxxx.yy" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/>
   <file name="msvcr90.dll" hash="3ca5156e8212449db6c622c3d10f37d9adb12c66" hashalg="SHA1"/>
   <file name="msvcp90.dll" hash="92cf8a9bb066aea821d324ca4695c69e55b27cff" hashalg="SHA1"/>
   <file name="msvcm90.dll" hash="7daa93e1195940502491c987ff372190bf199395" hashalg="SHA1"/>
</assembly>

Conjuntos lado a lado também podem usar arquivos de configuração do publicador, também chamado de arquivos de política, para redirecionar globalmente aplicativos e conjuntos de usar uma versão de um assembly lado a lado para outra versão do mesmo conjunto de módulos (assembly).Você pode verificar diretivas o assembly compartilhado do Visual C++ CRT %WINDIR%\WinSxS\Policies\x86_policy.9.0.Microsoft.VC90.CRT_ <versão>.diretiva quando executando o Windows XP ou no %WINDIR%\winsxs\Manifests\x86_policy.9.0.microsoft.vc90.crt_<versão> .manifesto ao executar o Windows Vista contém algo assim:

</assembly>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright © 1981-2001 Microsoft Corporation -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

   <assemblyIdentity type="win32-policy" name="policy.9.0.Microsoft.VC90.CRT" version="9.0.xxxxx.yy" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/>
   <dependency>
      <dependentAssembly>
         <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/>
         <bindingRedirect oldVersion="9.0.aaaaa.bbb-9.0.ccccc.d" newVersion="9.0.xxxxx.yy"/>
      </dependentAssembly>
   </dependency>
</assembly>

A diretiva acima Especifica que qualquer aplicativo ou assembly pede 9.0.aaaaa.bbb versão deste assembly em vez disso, deve usar a versão 9.0.xxxxx.yy deste assembly, que é a versão corrente instalada no sistema.Se uma versão do assembly mencionado no manifesto do aplicativo for especificada no arquivo de diretiva, o carregador de procura uma versão deste assembly especificado no manifesto na pasta WinSxS e, se esta versão não estiver instalada, a carga falha.E se um 9.0.xxxxx.yy de versão do assembly não estiver instalado, bem, o carregamento falhar para aplicativos que pedem 9.0.aaaaa.bbb de versão do assembly.

No entanto, o conjunto do CRT também pode ser instalado sistema autônomo um assembly lado a lado particular na pasta local do aplicativo.Se o sistema operacional não conseguir encontrar a CRT ou qualquer Outros conjunto sistema autônomo um assembly compartilhado, ele começa procurando o conjunto sistema autônomo um assembly particular.Ele procura particular assemblies na seguinte ordem:

  1. Verifique a pasta local do aplicativo para um arquivo de manifesto com nome <assemblyname>.manifest.Neste exemplo, o carregador tenta encontrar Microsoft.VC90.CRT.manifesto na mesma pasta sistema autônomo appl.exe.Se o manifesto for encontrado, o carregador carrega a DLL do CRT da pasta de aplicativo.Se a DLL do CRT não for encontrada, o carregamento falhar.

  2. Tente em em aberto pasta <assemblyName>na pasta local do appl.exe e se ele existir, carregar o manifesto de arquivo .manifest <assemblyName>desta pasta.Se o manifesto for encontrado, o carregador carrega a DLL do CRT da pasta <assemblyname>.Se a DLL do CRT não for encontrada, o carregamento falhar.

See sequência de pesquisa de assembly para obter uma descrição mais detalhada de como o carregador de procura assemblies dependentes.Se o loader falhar para localizar um assembly dependente sistema autônomo um assembly particular, carregamento falhar e "O sistema não pode executar o programa especificado" é exibida.Para resolver esse erro, assemblies dependentes e DLLs que fazem parte de eles devem ser instaladas no computador sistema autônomo assemblies particulares ou compartilhados.

Consulte também

Conceitos

Conceitos de aplicativos isolados e montagens lado a lado

Outros recursos

Desenvolvimento C/C ++ isolada de aplicativos e assemblies lado a lado