Compartilhar via


A solução de problemas C/C++ aplicativos isolados e montagens lado a lado

O aplicativo de energia AC /C ++ de carregamento pode falhar se as bibliotecas dependentes não podem ser encontradas.Este artigo descreve algumas razões por que o aplicativo comum de energia AC /C ++ não carrega, e sugere etapas para resolver problemas.

Se um aplicativo falha porque tem um manifesto que especifica uma dependência em um assembly lado a lado, e o assembly não é instalado como um conjunto de módulos particular na mesma pasta que o executável ou no native assembly na pasta %WINDIR% \ \ WinSxS, uma das seguintes mensagens de erro pode ser exibido, dependendo da versão do Windows em que você tenta executar o aplicativo.

  • O aplicativo não é inicializada corretamente 0xc0000135 ().

  • Falha na inicialização do aplicativo porque a configuração do aplicativo está incorreta.A reinstalação do aplicativo pode corrigir este problema.

  • O sistema não pode executar o programa especificado.

Se seu aplicativo não tiver nenhum manifesto e depende de uma DLL que não possa localizar o Windows em locais típicos de pesquisa, uma mensagem de erro que se esta assemelhasse pode ser exibida:

  • Este aplicativo não foi iniciado porque uma DLL necessária não foi encontrada.Reinstale o aplicativo pode corrigir este problema.

Se seu aplicativo é implantado em um computador que não tenha Visual Studio, e ele falhará com mensagens de erro parecidas com o anteriores, verificar essas ações:

  1. Siga as etapas descritas em Noções básicas sobre dependências de um aplicativo Visual C++.O caminhante de dependência pode mostrar a maioria das dependências de um aplicativo ou uma DLL.Se você observa que alguns DLL estão faltando, instalá-los no computador no qual você está tentando executar o aplicativo.

  2. O carregador do sistema operacional usa o manifesto do aplicativo para carregar assemblies que depende do aplicativo.O manifesto pode ser inserido em binário como um recurso, ou ser instalado como um arquivo separado na pasta do aplicativo.Para verificar se o manifesto é inserida em binário, abra o binário em Visual Studio e procure RT_MANIFEST em sua lista de recursos.Se você não conseguir localizar um manifesto incorporado, procure na pasta de aplicativo para um arquivo denominado algo como <binary_name>.<extension>.manifest.

  3. Se seu aplicativo depende dos módulos lado a lado e um manifesto não está presente, você precisará garantir que o vinculador gerar um manifesto para o seu projeto.Verifique a opção Gerar Manifesto do vinculador na caixa de diálogo de Propriedades do Projeto para o projeto.

  4. Se o manifesto é inserida em binário, certifique-se de que a identificação de RT_MANIFEST está correto para esse tipo de binário.Para obter mais informações sobre como a identificação do recurso utilizar, consulte Usando módulos lado a lado como um recurso (Windows).Se o manifesto está em um arquivo separado, abra-o em um editor XML ou em um editor de texto.Para obter mais informações sobre os manifestos e regras para implantação, consulte Manifestos.

    ObservaçãoObservação

    Se um manifesto inserido e um arquivo de manifesto separado estiverem presentes, o carregador do sistema operacional usa o manifesto incorporado e ignora o arquivo separado.No entanto, no Windows XP, o oposto é arquivo de manifesto separado verdadeiro - é usado e o manifesto incorporado é ignorado.

  5. Recomendamos que você insere um manifesto em cada DLL porque os manifestos externos são ignorados quando uma DLL é carregado embora uma chamada de LoadLibrary .Para obter mais informações, consulte O manifesto do assembly.

  6. Verifique se todos os assemblies que são enumerados no manifesto estão instalados corretamente no computador.Cada assembly é especificado no manifesto pelo nome, número de versão, e arquitetura do processador.Se seu aplicativo depende dos módulos lado a lado, verifique que esses assemblies são instalados corretamente no computador de modo que o carregador do sistema operacional pode encontrá-los, como descrito em Assembly que procura a sequência.Lembre-se que os assemblies de 64 bits não podem ser carregados em processos de 32 bits e não podem ser executados em sistemas operacionais de 32 bits.

Exemplo

Assumir-nos têm um aplicativo, appl.exe, que é criado usando Visual C++.O manifesto do aplicativo ou é inserido em appl.exe como o recurso binário RT_MANIFEST, que tem uma identificação igual a 1, ou armazenado como um arquivo separado appl.exe.manifest.O conteúdo desse manifesto é semelhante a este:

<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>

Ao carregador do sistema operacional, este manifesto informa que appl.exe depende de um assembly denominado Fabrikam.SxS.Library, a versão 2.0.20121.0, que é criado para uma arquitetura de 32 bits do processador x.O assembly lado a lado dependente pode ser instalado como um assembly compartilhado ou um conjunto de módulos particular.

O manifesto do assembly um assembly compartilhado é instalado em %WINDIR% \ \ \ WinSxS manifestos pasta.Identifica o assembly e lista seus conteudo que seja, as dlls que são parte do assembly:

<?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>

Assemblies lado a lado também podem usar arquivos de configuração do editor— também conhecido como a diretiva com a global redireciona aplicativos e assemblies usar uma versão de um assembly lado a lado em vez de outra versão do mesmo assembly.Você pode verificar as diretivas para um assembly compartilhado em %WINDIR% \ \ \ WinSxS diretivas pasta.Aqui está um arquivo de política de exemplo:

<?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>

Este arquivo de política especifica que um aplicativo ou assembly que pedirem a versão 2.0.10000.0 do assembly devem usar a versão 2.0.20121.0, que é a versão atual que é instalada no sistema.Se uma versão do assembly que é mencionado no manifesto do aplicativo é especificado no arquivo de política, o carregador procurando uma versão do assembly que é especificado no manifesto do WinSxS pasta %WINDIR% \ \, e se esta versão não estiver instalado, o carregamento falhará.E se a versão 2.0.20121.0 do assembly não estiver instalado, o carregamento falhará para aplicativos que solicita a versão 2.0.10000.0 do assembly.

No entanto, o conjunto também pode ser instalado como um assembly lado a lado particular na pasta instalada do aplicativo.Se o sistema operacional não encontra o assembly como um assembly compartilhado, procura-o como um conjunto de módulos particular, na seguinte ordem:

  1. Verifique a pasta de aplicativo para um arquivo de manifesto que tem o nome <assemblyName>.manifest.Nesse exemplo, o carregador tenta localizar Fabrikam.SxS.Library.manifest na pasta que contém appl.exe.Se encontrar o manifesto, o carregador carrega o assembly de pasta de aplicativo.Se o assembly não for encontrado, o carregamento falhará.

  2. Tente abrir<assemblyName>\ \ pasta na pasta que contém appl.exe, e se \ \<assemblyName>existir, tentativa para carregar um arquivo de manifesto que tem o nome <assemblyName>.manifest dessa pasta.Se o manifesto é encontrado, o carregador carrega o conjunto de<assemblyName>pasta \ \.Se o assembly não for encontrado, o carregamento falhará.

Para obter mais informações sobre como o carregador procura por assemblies dependentes, consulte Assembly que procura a sequência.Se o carregador não encontrar um assembly dependente como um conjunto de módulos particular, o carregamento falhará e a mensagem “o sistema não pode executar o programa” especificado é exibida.Para resolver esse problema, certifique-se que o assembly dependente e as dlls que é parte da - estão instalados no computador como conjuntos de módulos particulares ou compartilhados.

Consulte também

Conceitos

Conceitos de aplicativos isolados e montagens lado a lado

Outros recursos

Criação de C/C++ aplicativos isolados e montagens lado a lado