Compartilhar via


Compilando assemblies lado a lado do C/C++

Um assembly lado a lado é uma coleção de recursos, um grupo de DLLs, classes Windows, servidores COM, bibliotecas de tipos ou interfaces, disponibilizada para um aplicativo usar no tempo de execução. A principal vantagem de reempacotar DLLs em assemblies é que várias versões de assemblies podem ser usadas por aplicativos ao mesmo tempo e é possível atender a assemblies atualmente instalados no caso de uma versão de atualização.

Um aplicativo C++ pode usar uma ou várias DLLs em diferentes partes do aplicativo. No runtime, as DLLs são carregadas no processo principal e o código necessário é executado. O aplicativo depende do sistema operacional para localizar as DLLs solicitadas, entender quais outras DLLs dependentes devem ser carregadas e, em seguida, carregá-las junto com a DLL solicitada. Em versões de sistemas operacionais Windows anteriores ao Windows XP, Windows Server 2003 e Windows Vista, o carregador do sistema operacional procura por DLLs dependentes na pasta local do aplicativo ou em outra pasta especificada no caminho do sistema. No Windows XP, Windows Server 2003 e Windows Vista, o carregador do sistema operacional também pode pesquisar DLLs dependentes usando um arquivo de manifesto e pesquisar assemblies lado a lado que contenham essas DLLs.

Por padrão, quando uma DLL é criada com o Visual Studio, ela tem um manifesto do aplicativo inserido como um recurso RT_MANIFEST com ID igual a 2. Assim como para um executável, este manifesto descreve as dependências dessa DLL em outros assemblies. Isso pressupõe que a DLL não faz parte de um assembly lado a lado e os aplicativos que dependem dessa DLL não usarão um manifesto do aplicativo para carregá-lo, mas, em vez disso, dependem do carregador do sistema operacional para encontrar essa DLL no caminho do sistema.

Observação

É importante que uma DLL que usa um manifesto do aplicativo tenha o manifesto inserido como um recurso com ID igual a 2. Se a DLL for carregada dinamicamente em runtime (por exemplo, usando a função LoadLibrary), o carregador do sistema operacional carregará assemblies dependentes especificados no manifesto da DLL. Um manifesto de aplicativo externo para DLLs não é verificado durante uma chamada LoadLibrary. Se o manifesto não estiver inserido, o carregador poderá tentar carregar versões incorretas de assemblies ou não localizar assemblies dependentes.

Uma ou várias DLLs relacionadas podem ser reempacotadas em um assembly lado a lado com um manifesto de assembly correspondente, que descreve quais arquivos formam o assembly, bem como a dependência dele em outros assemblies lado a lado.

Observação

Se um assembly contiver uma DLL, recomendamos inserir o manifesto do assembly nessa DLL como um recurso com ID igual a 1 e dar ao assembly privado o mesmo nome que a DLL. Por exemplo, se o nome da DLL for mylibrary.dll, o valor do atributo de nome usado no <elemento assemblyIdentity> do manifesto também poderá ser mylibrary. Em alguns casos, quando uma biblioteca tem uma extensão diferente de .dll (por exemplo, um projeto de Controles ActiveX do MFC cria uma biblioteca .ocx), um manifesto de assembly externo pode ser criado. Nesse caso, o nome do assembly e seu manifesto precisam ser diferentes do nome da DLL (por exemplo, MyAssembly, MyAssembly.manifest e mylibrary.ocx). No entanto, ainda recomendamos renomear essas bibliotecas para ter extension.dll e inserir o manifesto como um recurso para reduzir o custo de manutenção futuro desse assembly. Para obter mais informações sobre como o sistema operacional pesquisa assemblies privados, confira Sequência de pesquisa de assembly.

Essa alteração pode permitir a implantação de DLLs correspondentes como um assembly privado em uma pasta local do aplicativo ou como um assembly compartilhado no cache de assembly do WinSxS. Várias etapas devem ser seguidas para obter o comportamento correto de runtime deste novo assembly. Elas são descritas em Diretrizes para criar assemblies lado a lado. Depois que um assembly é criado corretamente, ele pode ser implantado como um assembly compartilhado ou privado junto com um aplicativo que depende dele. Ao instalar assemblies lado a lado como um assembly compartilhado, você pode seguir as diretrizes descritas em Instalação de assemblies Win32 para compartilhamento lado a lado no Windows XP ou usar módulos de mesclagem. Ao instalar assemblies lado a lado como um assembly privado, basta copiar a DLL correspondente, os recursos e o manifesto do assembly como parte do processo de instalação para a pasta local do aplicativo no computador de destino, garantindo que esse assembly possa ser encontrado pelo carregador em runtime (consulte Sequência de pesquisa de assembly). Outra maneira é usar o Windows Installer e seguir as diretrizes descritas na instalação de assemblies Win32 para o uso privado de um aplicativo no Windows XP.

Confira também

Compilando aplicativos isolados do C/C++
Compilando aplicativos isolados do C/C++ e assemblies lado a lado