10
votes

Puis-je spécifier la productivité dans un titre de fenêtre?

Pour laisser les gens savoir quelle version du programme utilisée, je souhaite montrer la productivité dans le titre de la fenêtre. Je peux le faire manuellement, mais je veux que cela soit dynamique, je n'ai donc pas à modifier les deux articles à chaque fois que les modifications de la version.

est-ce possible que cela dans le code derrière sans gâcher avec l'installateur?


0 commentaires

4 Réponses :


6
votes

Essayez ceci:
system.reflection.assembly.getexecutingAssemblage (). GetName (). Version.Tostring ();


0 commentaires

11
votes

Vous pouvez récupérer la version à partir du AssembléeName.version code> Propriété à l'aide du code suivant:

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;

class Program
{
    [DllImport("msi.dll", CharSet = CharSet.Unicode)]
    static extern Int32 MsiGetProductInfo(string product, string property, 
        [Out] StringBuilder valueBuf, ref Int32 len);

    [DllImport("msi.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern Int32 MsiEnumRelatedProducts(string strUpgradeCode, 
        int reserved, int iIndex, StringBuilder sbProductCode);

    static void Main(string[] args)
    {
        List<string> installedVersions = 
            GetInstalledVersions("{169C1A82-2A82-490B-8A9A-7AB7E4C7DEFE}");

        foreach (var item in installedVersions)
        {
            Console.WriteLine(item);
        }
    }

    static List<string> GetInstalledVersions(string upgradeCode)
    {
        List<string> result = new List<string>();
        StringBuilder sbProductCode = new StringBuilder(39);
        int iIdx = 0;
        while (
            0 == MsiEnumRelatedProducts(upgradeCode, 0, iIdx++, sbProductCode))
        {
            Int32 len = 512;
            StringBuilder sbVersion = new StringBuilder(len);

            MsiGetProductInfo(sbProductCode.ToString(), 
                "VersionString", sbVersion, ref len);

            result.Add(sbVersion.ToString());
        }
        return result;
    }
}


19 commentaires

Vous ne devez pas utiliser string.format ici. En outre, typeof (myform). Assembly sera beaucoup plus rapide.


@Slaks: Il est vrai que cela est légèrement plus lent, mais je doute que cela soit jamais important (sauf si vous souhaitez interroger la version 1000 fois par seconde, mais vous avez un autre problème beaucoup plus important ;-). Il convient toutefois de noter que assemblage.getexecutingassemblage () et typeof (myform). Assembly peut être des éléments différents afin de choisir avec soin tout ce dont vous avez besoin.


@Pete: Pourquoi forcer une tranche d'analyse de chaîne lorsque vous n'êtes pas obligé?


Votre version donne 1.0.0.0, tandis que la configuration est définie sur 1.0.16, pourquoi est-ce?


@Djerry: la version de configuration et la version d'assemblage sont des choses différentes. La version de montage est spécifiée dans le fichier montageInfo.cs dans le sous-répertoire Propriétés de votre projet.


Au lieu de demander à Associéversion, il est beaucoup plus facile de le mettre manuellement dans le titre alors?


@djerry: Voir ma mise à jour pour savoir comment obtenir la version spécifiée par la configuration.


Vous devez vraiment mettre à jour votre version de montage pour correspondre à la version du package d'installation.


@Scott P: une productivité ne doit pas nécessairement être égale à un assemblageversion. Et si votre produit est composé de plusieurs assemblées? Chaque assemblée pourrait avoir une version individuelle appliquée alors. Ou quoi, si vous mettez simplement à jour les ressources externes et expédier une nouvelle version? Ensuite, votre version de montage resterait inchangée.


@Scott P: Et j'ai oublié de mentionner qu'il existe également des raisons de quitter la version de montage inchangée, même si elles contiennent une nouvelle version de votre code en tant que nouvelle version d'assemblage pourraient être une modification de rupture, voir blogs.msdn.com/b/suzcook/archive/2003/05/29/57148 .aspx


Je ne suis pas d'accord avec la logique de Suzanne. Je mettez à jour toutes les versions de la version / Assemblée de fichiers dans une solution ensemble. Le numéro de construction change avec chaque changement. Je change la révision mineure avec chaque construction de production. Je pense que la version du fichier étant superflue.


Je peux voir comment la version de production peut diverger de la version du programme d'installation, en particulier dans le cas de la correction des installations existantes. Cependant, je ne suis pas sûr de vouloir afficher le numéro de version du programme d'installation de mon exécutable au lieu du numéro de version du produit.


Eh bien, tous ensemble, je ne reçois aucune information de la méthode mise à jour


@djerry: Avez-vous utilisé le code de mise à niveau spécifié dans votre configuration et est le produit en réalité installé? Sinon, vous ne récupérerez rien. Le code de mise à niveau utilisé dans mon code n'est qu'un échantillon fictif.


Oui, j'ai mis le code de ma configuration en elle et j'ai essayé à la fois de déboguer (figuré qu'il était évident que cela ne fonctionnerait pas) mais après avoir installé toujours aucun retour d'information.


@Djerry: Autant que je me souvienne, le GUID de mise à niveau doit être dans des accolades bouclées et toutes les lettres doivent être majuscules. Pouvez-vous s'il vous plaît vérifier que c'est le cas? Assurez-vous également de ne pas mélanger la mise à niveau et le produit.


{0B857052-6458-4CD4-B04C-0825BB29E148} Je l'ai comparé à votre code, donc je sais que c'était le bon


@DJerry: Si vous êtes sur un système d'exploitation 64 bits, assurez-vous également de ne pas utiliser le paramètre AnyCPU car cela pourrait affecter la récupération correcte des informations MSI.


Je ne suis pas, j'utilise la version x86 pour d'autres raisons aussi



0
votes

comme ceci: xxx

Ceci lira le [Assemblage: assemblage ("...")] attribut de montageInfo.cs, qui peut aussi être Situé dans Propriétés du projet (en cliquant sur les informations de montage ... bouton)


0 commentaires

2
votes

Voici ma solution en utilisant la base de données et la réflexion:

in xaml: xxx

en code: xxx


0 commentaires