2009-08-12 9 views
6

Las recientes actualizaciones de seguridad de Visual Studio 2005 pueden estar causando problemas para nosotros.Actualizaciones de seguridad de Visual Studio 2005 y versiones de CRT DLL en manifiesto

Construimos y distribuimos internamente SDK escritos en C++. Estos SDK son solo una colección de archivos de encabezado y bibliotecas estáticas. Después de instalar las actualizaciones de seguridad, nuestros SDK ahora dependen de las versiones más recientes de las DLL de CRT de MSVC. Estos SDK se utilizan en etapas posteriores en proyectos que producen archivos EXE.

Si uno de estos archivos EXE se genera con una combinación de SDK (algunos de antes de las actualizaciones de seguridad y algunos posteriores), el archivo EXE generado hace referencia a dos conjuntos de archivos DLL de tiempo de ejecución MSVC. Por ejemplo:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <dependency> 
     <dependentAssembly> 
      <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.4053" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b"> 
      </assemblyIdentity> 
     </dependentAssembly> 
    </dependency> 
    <dependency> 
     <dependentAssembly> 
      <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b"> 
      </assemblyIdentity> 
     </dependentAssembly> 
    </dependency> 
</assembly> 

¿Esto significa que en tiempo de ejecución este EXE utilizará ambas versiones de la DLL? ¿Significa esto que debemos distribuir ambas versiones de los archivos DLL MSVC Runtime con este EXE?

¿Hay una manera simple de evitar este problema sin forzar que todos los SDK se construyan con los parches de seguridad de Visual Studio 2005 instalados? (Esto sería indeseable para algunos de los SDK más antiguos y bastante estables que no queremos reconstruir innecesariamente)

Es posible simplemente reescribir el archivo de manifiesto en los SDK o en el archivo EXE final para que solo uno versión de MSVC CRT DLL se mencionan?


Mi entendimiento es que las actualizaciones relevantes son los siguientes:

Actualización de seguridad para Microsoft Visual Studio 2005 Service Pack 1: KB971090

http://go.microsoft.com/fwlink/?LinkId=155934

Actualización de seguridad para Microsoft Visual Studio 2008 Service Pack 1: KB971092

http://go.microsoft.com/fwlink/?LinkID=155933


he descubierto otras dos preguntas que son similares:

VC++: KB971090 and selecting Visual C Runtime DLL dependencies

Does the latest Visual Studio 2005 Security Update cause C runtime library issues when hot fixing customer sites

+0

¿por qué se pasó a la wiki de la comunidad? –

Respuesta

2

1) Sí Esto significa que el tiempo de ejecución está usando ambas versiones - algo que nunca quiere que suceda. Solo debería hacer referencia a una única versión de la (s) DLL (s)

2) Hay un método que he desarrollado para forzar a la versión a ser la versión SP1 (sin la actualización de seguridad). Lo he esbozado here

3) Puede deshabilitar los manifiestos por completo y hacerlos a mano, pero no lo recomiendo, ya que es complicado mantener diferentes manifiestos para su depuración y liberación, y es un error- forma propensa de lidiar con el problema. Sería mejor utilizar la solución que mencioné en (2) arriba.

2

Como dice Ted, en tiempo de ejecución su ejecutable intentará usar ambas versiones de la DLL. Esto es probablemente debido a que no ha recompilado por completo todo el proyecto (o está utilizando bibliotecas externas que se han compilado para depender del tiempo de ejecución .762).

La buena noticia es que si ambas bibliotecas están instaladas en sus sistemas cliente, entonces la política de redireccionamiento lado a lado significará que solo se cargará la última. Con mucho, el efecto secundario más perjudicial que notará es cuando solo uno está instalado (probablemente .762) que la aplicación no podrá comenzar con la vieja "aplicación no configurada correctamente, reinstalando puede solucionar este problema" mensaje de error.

¿Esto significa que debemos distribuir ambas versiones de las DLL de MSVC Runtime con este EXE?

La solución más fácil para usted sería simplemente enviar la última versión de Visual C++ Runtime redistributable que puede obtener desde el siguiente enlace.

http://download.microsoft.com/download/6/B/B/6BB661D6-A8AE-4819-B79F-236472F6070C/vcredist_x86.exe

Puede ser un poco de dolor, ya que pide al usuario que haga clic en "Estoy de acuerdo" en una página EULA y requiere priveledges de administración sino por consenso general, es la mejor opción si se puede obtener el usuario para instalarlo.

Cuestiones relacionadas