2010-11-16 31 views
2

J'ai une DLL en mode mixte construite dans Visual Studio 2005. Dans le dépendant de dépendances, ma DLL montre une dépendance des Dll CRT suivants. Notez que ceci est sur ma machine de développement Windows 7.Comment réparer la dépendance CRT provoquant une exception FileLoadException avec ma DLL en mode mixte vc2005 sur XP?

c: \ windows \ winsxs \ x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4927_none_d08a205e442db5b5 \ msvcp80.dll

"\ Msvcr80.dll

" \ msvcm80.dll

8.0.50727.4927

Sur ma machine de développement Windows 7 en utilisant Visual Studio 2005, cela se compile et s'exécute très bien. le problème est qu'il ne fonctionnera pas sur ma machine de test Windows XP avec le dernier CRT installé. Lorsque je fais glisser la DLL dans le walker depenency sur la machine XP, il semble chercher les DLL dans \ System32 ... (Je suis allé montrer le chemin complet et il n'y avait pas de chemins pour eux, juste un point d'exclamation jaune

Le problème est que cette version (build 4927) du crt dans WinSxS n'est pas installée sur la machine de test XP. il a Visual Studio 2005 avec le dernier CRT installé (sp1?).

8.0.50727.4053 est la dernière version que j'ai pu trouver sur MSDN.

Je me rends compte que ce n'est pas la question la plus excitante publiée sur SO, mais est-ce que quelqu'un sait ce qui se passe avec cette exécution 4927?

* EDIT *

Le manifeste généré par mt.exe:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<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="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> 
    </dependentAssembly> 
    </dependency> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> 
    </dependentAssembly> 
    </dependency> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

Donc, il y a 3 versions différentes, il vise ...

Répondre

1

Révision 4927 est une version spécifique à Windows 7, probablement utilisée par les binaires Microsoft. Votre build ne devrait pas créer de dépendance, 4053 est le dernier pour VS2005. Ne pas résoudre ce problème avec depends.exe btw, il n'est pas bon à suivre les dépendances winsxs. Commencez le dépannage en vérifiant à nouveau la dépendance que génère votre génération. Premier coup d'oeil dans vc \ include \ crtassem.h, la macro _CRT_ASSEMBLY_VERSION génère l'entrée du manifeste. Ensuite, vérifiez le manifeste incorporé dans votre exécutable. Le répertoire Release de votre projet contient le fichier .embed.manifest incorporé. Et File + Open + File sur votre exécutable vous permet de jeter un coup d'œil à la ressource RT_MANIFEST intégrée.

+0

La version dans la macro _CRT_ASSEMBLY_VERSION est la révision 4053 pour moi, qui a la machine XP. Il y a un mydll.dll.manifest dans mon dossier de sortie, quand je l'ouvre il indique 8.0.50608.0 (RTM?). Je n'ai pas trouvé un embed.manifest dans mon répertoire de solution. pouvez-vous élabérer sur la partie Fichier + Ouvrir + Fichier? J'ai regardé le manifeste dans ILDasm et il dit ".module extern MSVCR80.dll" et ".assembly extern Microsoft.VisualC {ver 8: 0: 0: 0}" .. Je suppose qu'il s'agit d'un manifeste "Managed" et cette section RT_MANIFEST est une sorte de chose PE intégrée? Je me trompe probablement, s'il vous plaît éduquez-moi =) –

+0

Si ildasm.exe fonctionne, il s'agit en fait d'une DLL managée. Êtes-vous #including tout en-têtes CRT dans le code C++/CLI? Si vous n'avez pas alors au moins inclure crtdefs.h pour obtenir le manifeste approprié. –

+0

Vous pouvez également utiliser ManifestView (http://weblogs.asp.net/kennykerr/archive/2007/07/10/10manifest-view-1-0.aspx) pour extraire le manifeste d'une DLL ou d'un exécutable. –