FileVersionInfo.GetVersionInfo () incorrect dans l’application console

FileVersionInfo.GetVersionInfo () m’intéresse beaucoup et espère que quelqu’un pourra peut-être vous aider.

La base du problème est que je parcourt tous les fichiers d’un dossier en appelant GetVersionInfo () sur chacun d’eux. Il y a environ 300 fichiers. Cela fonctionne pour tous les fichiers sauf 2. Pour ces DLL, GetVersionInfo () m’apporte des informations incorrectes.

Afin d’éliminer toutes les autres variables, j’ai extrait cet appel dans une application de test simple et il a toujours le même problème. Cependant, si j’ai construit l’application de test en tant qu’application Windows (il s’agissait initialement d’une application console), les données sont revenues correctement.

Juste pour clarifier, les données incorrectes qui reviennent lors de l’exécution en tant qu’application console ne sont pas simplement des informations null, comme ce serait le cas si le fichier ne contient pas de données de version. Il contenait des données raisonnables, mais juste les mauvaises données. C’est comme si c’était en train de le lire dans un fichier différent. J’ai cherché un fichier contenant les données de version correspondantes, mais je n’en trouve pas.

Pourquoi cet appel simple fonctionne-t-il différemment s’il est créé en tant qu’application console plutôt qu’en application Windows?

Si quelqu’un pouvait m’aider, je vous en serais très reconnaissant.

Rgds, Andy

– Code ajouté

using System; using System.Diagnostics; namespace test { class Program { static void Main(ssortingng[] args) { ssortingng file = "C:\\ProblemFile.dll"; FileVersionInfo version = FileVersionInfo.GetVersionInfo(file); ssortingng fileName = version.FileName; ssortingng fileVersion = version.FileVersion; Console.WriteLine(ssortingng.Format("{0} : {1}", fileName, fileVersion)); } } } 

Ce comportement semble vraiment étrange. Se pourrait-il que l’application console ne charge pas la DLL à partir du même endroit que l’application WinForms? Cela signifierait que GetVersionInfo utilise une autre API que Win32 CreateFile (en passant par un mécanisme de résolution de DLL, côte à côte ou autre); rappelez-vous que sous les couvertures, version.dll exécutera votre demande, pas le CLR lui-même.

Regarder FileVersionInfo travers Reflector pointe encore dans une autre direction:

 public static unsafe FileVersionInfo GetVersionInfo(ssortingng fileName) { // ... int fileVersionInfoSize = UnsafeNativeMethods.GetFileVersionInfoSize(fileName, out num); FileVersionInfo info = new FileVersionInfo(fileName); if (fileVersionInfoSize != 0) { byte[] buffer = new byte[fileVersionInfoSize]; fixed (byte* numRef = buffer) { IntPtr handle = new IntPtr((void*) numRef); if (!UnsafeNativeMethods.GetFileVersionInfo(fileName, 0, fileVersionInfoSize, new HandleRef(null, handle))) { return info; } int varEntry = GetVarEntry(handle); if (!info.GetVersionInfoForCodePage(handle, ConvertTo8DigitHex(varEntry))) { int[] numArray = new int[] { 0x40904b0, 0x40904e4, 0x4090000 }; foreach (int num4 in numArray) { if ((num4 != varEntry) && info.GetVersionInfoForCodePage(handle, ConvertTo8DigitHex(num4))) { return info; } } } } } return info; } 

Comme vous pouvez le constater, des pages intéressantes sont en cours de danse. Que se passe-t-il si les DLL que vous avez inspectées étaient associées à plusieurs ressources d’informations de version? Selon la culture du programme appelant dans GetVersionInfo , je suppose que les appels liés à la page de codes pourraient renvoyer d’autres résultats?

Prenez le temps de vérifier les ressources des DLL et assurez-vous qu’il n’existe qu’une seule langue / page de code pour les informations de version. J’espère que cela vous indiquera la solution.

Bien sûr, les “fichiers” que vous voyez ne le sont pas. et .. ? Si vous parcourez tous les fichiers, vous verrez toujours des entrées pour. (dir actuel) et .. (dir vers le haut). GetVersion Info peut très bien vous renvoyer n’importe quoi. Vous devez filtrer ces entrées manuellement par nom.

Les versions de fichier et d’assemblage sont deux choses différentes.

Êtes-vous sûr de ne pas attendre l’autre?

Mise à jour: essayé ceci. N’a pas fonctionné

 using System; using System.Diagnostics; using System.Runtime.InteropServices; namespace test { class Program { [DllImport("COMCTL32")] private static extern int InitCommonControls(int nExitCode); static void Main(ssortingng[] args) { InitCommonControls(0); ssortingng file = "C:\\ProblemFile.dll"; FileVersionInfo version = FileVersionInfo.GetVersionInfo(file); ssortingng fileName = version.FileName; ssortingng fileVersion = version.FileVersion; Console.WriteLine(ssortingng.Format("{0} : {1}", fileName, fileVersion)); } } }