Devo redistribuir msvcrt.dll com o meu aplicativo?

Devo redistribuir msvcrt.dll com o meu aplicativo e usar a dll privada se algumas das bibliotecas do aplicativo dependem dinamicamente de msvcrt.dll? Ou seja, quaisquer problemas de incompatibilidade possíveis com msvcrt.dll do sistema (dll hell)? O aplicativo é direcionado para sistemas Windows Server.

msvcrt – é uma biblioteca dinâmica para o tempo de execução do Microsoft Visual C ++.

Existem duas opções para usar o tempo de execução C no Windows:

  1. link com libs de tempo de execução estático.
    Use a opção /MT ou /MTd para cl.exe. Nesse caso, você não terá nenhuma dependência na DLL msvcrt e, portanto, você não precisará redistribuí-lo. No Visual Studio, clique com o botão direito do mouse em Projeto ou Solução, Propriedades> C / C ++ -> Geração de Código-> Biblioteca de Tempo de Execução use debugging Multithreaded e Multithreaded respectivamente. Esse é o caminho mais fácil. A desvantagem é que o executável resultante é maior.

  2. link com a biblioteca C Runtime dinâmica.
    Você usará a opção /MD ou a opção /MDd para cl.exe.
    No Visual Studio, clique com o botão direito do mouse em Projeto ou Solução, Propriedades> C / C ++ -> Geração de Código-> Biblioteca de Tempo de Execução use o link dynamic multithreaded e a debugging de link dynamic multithreaded respectivamente. Isso resulta em um EXE menor, mas a desvantagem é que você deve instalar o MSVCRT necessário ao instalar seu aplicativo.


Cada versão do compilador VC ++ vem com uma versão do tempo de execução C (CRT). Visual Studio 2005 fornecido com v8 do compilador e v8 do CRT. A DLL real para v8 foi msvcrt80.dll. Para VS2008, era v9 e o CRT dynamic era msvcrt90.dll. Mas, o CRT é atualizado e corrigido com mais freqüência do que o compilador C / C ++. Um desenvolvedor pode baixar um CRT atualizado e construir com base nele.

Se você compilar com a biblioteca CRT dinâmica, você DEVE baixar um pacote redistribuível para a versão necessária do tempo de execução do microsoft.com e executar uma instalação (potencialmente silenciosa) durante a instalação do aplicativo.


Antes do VS2005, os desenvolvedores criaram aplicativos para depender do MSVCRT que estava no sistema operacional Windows. Isso daria o benefício da DLL (tamanho pequeno da imagem), enquanto não incorrer no requisito de envio da DLL CRT na instalação do aplicativo. Antes do Windoes 2000, os desenvolvedores instalavam um novo MSVCRT.dll na pasta de instalação \ Windows. Mas, compartilhar o CRT em muitos aplicativos e no sistema operacional também acabou sendo uma péssima ideia. Com o WinXP SP2, o CRT incluído no Windows mudou significativamente, e todos os aplicativos que dependiam dessa versão do CRT corriam o risco de quebrar.

Neste ponto, a Microsoft informa aos desenvolvedores que o MSVCRT.dll incluído no Windows faz parte do sistema operacional e pode ser reparado ou corrigido a qualquer momento. Não é suportado para criar um aplicativo contra ele. Portanto, os aplicativos devem usar um dos methods acima.

Referências:

  • a documentação de referência do VC ++ no MSDN .
  • download para o redist de MSVCRT90 v9.0.21022 (x86 VS2008)
  • download para o redist de MSVCRT90 v9.0.30729.4148 (x86 VS2008 SP1)

Você deve enviar o msvcrt com o seu aplicativo. Não é uma parte garantida do sistema operacional. Se uma determinada versão do Windows acontece , é só porque algo no Windows está usando.

Os aplicativos quebraram quando versões mais recentes do Windows não continham os binários que as pessoas supunham que o Windows tinha. As aplicações quebraram quando o usuário optou por não instalar o WinFax, o que significa que o msvcrt não foi instalado com ele.

De Raymond Chen :

Dependendo de qual versão do Windows você está executando, pode haver uma variedade de DLLs de suporte para coisas que não são componentes formais do produto, mas que são meramente para o passeio.

Este problema persiste hoje. As pessoas vão vasculhando os binários que vêm com o Windows em busca de algo que possam remorer . E então eles ficam surpresos quando esses binários mudam ou desaparecem completamente.

From KB326922 – Redistribuição do componente de tempo de execução C compartilhado no Visual C ++ :

… a DLL de CRT não é mais considerada um arquivo de sistema, portanto, distribua a DLL de CRT com qualquer aplicativo que se baseie nela. Como não é mais um componente do sistema, instale-o em seu diretório de Arquivos de Programas do aplicativo com outro código específico do aplicativo. Isso impede que seu aplicativo use outras versões da biblioteca CRT que podem ser instaladas nos caminhos do sistema.

Você deve enviar o msvcrt com seu aplicativo, se você vincular ao MSVCRT .

Mais

foi tomada a decisão de simplesmente desistir e declarar que é uma DLL do sistema operacional, a ser usada apenas pelos componentes do sistema operacional.

Embora o MSVCRT.DLL tenha sido uma DLL do sistema operacional há muito tempo e tenha sido documentado como fora dos limites para os aplicativos , ainda há muitas pessoas que o tratam como um canal de entrega em tempo de execução do C , e esses programas criam muito luto pela equipe do produto.

Você deve redistribuir o Microsoft Visual C Runtime com o seu aplicativo, porque o Windows não é fornecido com qualquer Microsoft Visual C Runtime. Pode acontecer de haver uma DLL chamada msvcrt.dll (que não é garantida), não é o MSVCRT.

A resposta de Chris não deve ser rejeitada porque ambas estão certas.

A questão é que existem dois conjuntos diferentes de MSVCRTs. Um conjunto é o msvcrt80.dll, msvcrt90.dll, etc., que vem com o Visual Studio. Isso é o que as pessoas normalmente usam. E eles devem ser redistribuídos, como falado em outras respostas.

O outro é o msvcrt.dll (sem números no nome do arquivo) na pasta System32, que se destina a ser usado somente pelo próprio sistema operacional desde há algum tempo. E os aplicativos nunca devem replace / reinstalar. No entanto, alguns aplicativos vinculam a ele, por alguns motivos, como remover as dependencies extras para instalação. Mas esteja ciente de que não é garantido que esteja disponível na versão futura do Windows.

msvcrt.dll tornou-se uma parte de fato da distribuição do sistema operacional. No Windows 98 e 95 e, possivelmente, no NT4, foi possível obter instalações do sistema operacional sem ele, se alguém quisesse remover aplicativos como o WordPad da instalação.

Dada a sua onipresença no entanto, eo fato de que, desde aqueles sistemas operacionais muito poucos desenvolvedores de aplicativos se preocuparam em enviá-lo, pelo menos desde o Windows 2000 tem sido uma parte oficial do sistema operacional.

Suporte da Microsoft tem uma ferramenta que você pode usar para verificar novamente quais produtos DLLs são enviados com.

Execute uma pesquisa como esta e você pode ver que o msvcrt.dll vsrsion 7.0.3790.0 fazia parte da versão 2003 do servidor Windows.

    Intereting Posts