2010-04-22 26 views
2

Je compile un projet qui utilise plusieurs DLL et compile avec VS2008. Après une récente mise à jour Windows, les DLL compilées sur mon ordinateur ont cessé de fonctionner sur d'autres ordinateurs.La mise à jour Windows casse les DLL?

Après une enquête, il est apparu que la bibliothèque à jour redistribuable CRT que je suis avec la compilation de la version « 9.0.21022.8 » à la version « 9.0.30729.4148 »

Cela est évident à partir du fichier Manifest du EXE je compile. il contient ce qui suit:

<dependency> 
    <dependentAssembly> 
     <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> 
    </dependentAssembly> 
    </dependency> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> 
    </dependentAssembly> 
    </dependency> 

Signification voulant utiliser deux versions différentes du CRT en même temps. la deuxième version est nécessaire par le code que je compile en ce moment et la première version est nécessaire pour les anciennes DLL qui ont été compilées il y a quelques semaines.

Sur les ordinateurs sur lesquels l'application est déployée, cela devient un problème car ils obtiennent leur DLL CRT à partir d'un dossier local appelé Microsoft.VC90.CRT et non de WinSXS. Ce dossier ne peut pas contenir deux versions différentes de la DLL.

Y a-t-il une solution connue à ce problème ou dois-je commencer à compiler toutes les autres DLL avec le nouveau CRT?

+0

Je pense avoir remarqué le même problème la semaine dernière. Après une mise à jour de Windows, un projet qui avait été construit correctement la veille, n'est plus construit. En fait, il a provoqué un crash ICE dans le compilateur VS2008. Une reconstruction tout a fixé ceci. Je n'ai jamais déterminé la cause exacte, mais ce n'est pas une grosse affaire pour moi car nous n'avons pas encore expédié. – demoncodemonkey

Répondre

0

Ceci est l'un des nombreux maux de tête causés par les assemblages côte à côte. Chaque fois qu'il y a une mise à jour pour Visual Studio, vous devez vraiment recompiler tout votre code. Parce qu'il y avait un changement de version dans le CRT, une partie de votre code utilise une DLL et le reste en utilise une autre.

En outre, lors de la distribution, vous devez vraiment distribuer le CRT via des modules de fusion ou le appropriate installation set au lieu de copier les DLL dans le dossier de l'application. Cela permettra au programme de rechercher le (s) runtime (s) approprié (s) via WinSxS. Enfin, si vous souhaitez supprimer complètement le problème, comme vous l'avez fait, vous pouvez modifier tous vos projets en link statically with the CRT et tout recompiler. Cela supprimera complètement la dépendance sur la DLL d'exécution - au moins, avec votre propre code. Plus de WinSxS à vous soucier d'ici.