2017-01-17 11 views
3

J'ai un fichier SFX (exécutable auto-extractible) dans les fenêtres (créés avec les outils zip comme 7z, WinRar, ....) avec les détails suivants:LegalCopyRight est toujours vide dans FileVersionInfo C#?

File Details

Je veux obtenir CopyRight texte en C#, donc je l'ai écrit le code suivant:

var fileVersionInfo = FileVersionInfo.GetVersionInfo(filePath); 
Console.Write(fileVersionInfo.LegalCopyright) 

fileVersionInfo.LegalCopyright est toujours vide! Quel est le problème?

Edit:
Mon code d'origine:

var fileVersionInfo = FileVersionInfo.GetVersionInfo(filePath1); 
var properties = typeof(FileVersionInfo).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
foreach (var propertyInfo in properties) 
{ 
    var value = propertyInfo.GetValue(fileVersionInfo); 
    Console.WriteLine("{0} = {1}", propertyInfo.Name, value); 
} 
Console.ReadKey(); 

Le résultat:

File Details

+0

FileVersionInfo n'a pas de bogue. Passez en revue [cet article] (http://stackoverflow.com/a/23145471/17034). L'erreur la plus évidente que vous pourriez faire ici est d'essayer d'obtenir l'information pour le fichier SFX au lieu de votre propre fichier. Ou l'inverse. –

+0

ajoutez un 'Console.Write (filePath)' pour prouver que vous lisez le bon fichier. Les autres propriétés d'info de version sont-elles également vides? – dlatikay

+1

Je suis absolument sûr de 'filePath'. S'il vous plaît voir la section d'édition. –

Répondre

1

Enfin je pouvais trouver une solution:
1. d'abord installer le package suivant:

Microsoft.WindowsAPICodePack.Shell 

Il a un paquet de dépendance, Nuget installer automatiquement Microsoft.WindowsAPICodePack.Core

Maintenant, nous pouvons obtenir les propriétés du fichier comme le code suivant

using System; 
using System.Reflection; 
using Microsoft.WindowsAPICodePack.Shell.PropertySystem; 

namespace ConsoleApplication1 
{ 
    internal class Program 
    { 
     private static void Main() 
     { 
      const string filePath1 = @"C:\Users\Mohammad\Downloads\Test\.....exe"; 
      var shellFile = Microsoft.WindowsAPICodePack.Shell.ShellObject.FromParsingName(filePath1); 
      foreach (var propertyInfo in typeof(ShellProperties.PropertySystem).GetProperties(BindingFlags.Public | BindingFlags.Instance)) 
      { 
       var shellProperty = propertyInfo.GetValue(shellFile.Properties.System, null) as IShellProperty; 
       if (shellProperty?.ValueAsObject == null) continue; 
       var shellPropertyValues = shellProperty.ValueAsObject as object[]; 
       if (shellPropertyValues != null && shellPropertyValues.Length > 0) 
       { 
        foreach (var shellPropertyValue in shellPropertyValues) 
         Console.WriteLine("{0} = {1}", propertyInfo.Name, shellPropertyValue); 
       } 
       else 
        Console.WriteLine("{0} = {1}", propertyInfo.Name, shellProperty.ValueAsObject); 
      } 
      Console.ReadKey(); 
     } 
    } 
} 
5

(Ma réputation est trop faible pour faire un commentaire, donc je poste ici)

Je viens de tester le code suivant, et cela fonctionne normalement pour moi.

var fileVersionInfo = FileVersionInfo.GetVersionInfo(@"C:\Users\usr\Desktop\Game\steamIntegration\steam_api.dll"); 
Console.Write(fileVersionInfo.LegalCopyright); 
Console.ReadLine(); 

Peut-être que vos autorisations ne sont pas suffisantes pour ce fichier. Ajouter un * .manifest à votre projet changer le requestedExecutionLevel à:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 

Peut-être qui résout votre problème.

+1

c'est plus une réponse qu'un commentaire déjà, alors ne vous inquiétez pas. peut-être que cela a à voir avec le type de fichier SFX, avez-vous testé uniquement avec une DLL, ou avec un SFX aussi? peut-être shell peut jeter un coup d'oeil dans le format compressé, et FileVersionInfo ne peut pas? – dlatikay

+0

Ok, je viens de télécharger 7-ZIP SFX Maker v3.3 pour créer un SFX par moi-même. J'étais encore capable de lire les droits d'auteur, même avec des droits d'invocateur. –

+0

Merci pour la réponse, je l'ai testé, Pas de changement, «LegalCopyright» est encore vide –

1

Le comportement que vous observez est en raison d'une lacune dans la mise en œuvre de la fonction privée GetVersionInfoForCodePage dans la ligne 411 de la classe cadre de Microsoft.NET FileVersionInfo, actuellement en version 4.6.2 et probablement beaucoup plus tôt:

// fileVersion is chosen based on best guess. Other fields can be used if appropriate. 
return (fileVersion != string.Empty); 

Cette citation de la source de référence (commentary) signifie que la fonction abandonnera une information de version spécifique à la page de code, si son membre fileVersion est vide (celui du bloc, pas celui de l'en-tête, ce qui ajoute à la confusion).

Tel est le cas avec votre fichier exe:

version info as ResHacker shows it

Lorsque nous modifions le cadre d'utiliser cette place ...

return (productVersion != string.Empty); 

... cela fonctionne comme prévu (testé dans la console et l'application Windows):

output from patched version

Ainsi deux options:

  1. compilez le exe de sorte que son FileVersion ne se termine pas vide. J'espère que ce n'est pas la faute de votre outil de compression de ne pas transporter cette information.
  2. Fichier un bug avec Microsoft.Ce que j'ai glané de leur licence de source de référence, il ne permet pas d'inclure des travaux dérivés dans n'importe quel produit.