none
Utilisation de l'Objet Solution RRS feed

  • Discussion générale

  • Bonjour,

    Je cherche à utiliser l'Objet Solution (DTE.Solution) et je bute lamentablement sur la création de l'obet

    public

     

    Solution mySol = new Solution();

    le message d'erreur à l'éxécution est : La récupération de la fabrique de classes COM pour le composant avec le CLSID {B35CAA8C-77DE-4AB3-8E5A-F038E3FC6056} a échoué en raison de l'erreur suivante : 80040154 Classe non enregistrée (Exception de HRESULT : 0x80040154 (REGDB_E_CLASSNOTREG)).

    si quelqu'un peut m'aider, merci d'avance.

    Cordialement


    BRI67
    lundi 9 mai 2011 16:51

Toutes les réponses

  • Bonjour,

    A priori cela n'est pas prévu pour être créé explicitement (voir par exemple http://www.mztools.com/articles/2006/mz2006004.aspx).

    D'après ce que je vois DTE.Solution est la propriété qui expose la solution en cours (éventuellement "fermée" si aucune solution n'est chargé) et une méthode Create sur cette solution permet éventuellement de créer une nouvelle solution si c'est ce que l'on veut faire. On est dans une macro ?

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mercredi 11 mai 2011 16:44
    Modérateur
  • Bonjour, BRI_67,

    Est-ce que la réponse de Patrice vous a aidé à comprendre la source de votre problème ? Merci pour partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

     

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    vendredi 13 mai 2011 06:36
  • Tout d'abord merci pour la réponse.

    J'avais déjà consulté ce lien (http://www.mztools.com/articles/2006/mz2006004.aspx) ainsi que http://msdn.microsoft.com/fr-fr/library/aa301150.aspx, http://msdn.microsoft.com/fr-fr/library/aa301007.aspx, http://msdn.microsoft.com/fr-fr/library/aa301056.aspx etc....

    Ce qui m'ennuie c'est que tout ces articles mentionne visual Studio .NET 2003 ou comme le premier Visual Studio 2005 et les exemples sont uniquement en Basic. (j'ai rien contre le Basic mais je travaille en C# ou C++)

    Le premier article dit bien "Navigates the files of a solution from Visual Studio .NET macro or add-in" et je voudrais récupérer le modèle Objet Solution dans un  programme écrit avec Visual C# 2010 Express.

    Le seul article faisant référence à Visual Studio 2010 est :  http://msdn.microsoft.com/fr-fr/library/envdte._solution qui expose toutes les propriétés et méthodes de l'interface _Solution avec un exemple pour la méthode Open que je n'ai pas encore testé (travaillant sur un autre projet).

    Il me reste aussi à étudier l'article : http://msdn.microsoft.com/fr-fr/library/ms228763.aspx qui s'intitule "Découverte de code à l'aide du Modèle de code (Visual C#)" avec un exemple de code.

    Dés que j'ai mis en oeuvre l'exemple en question je ne manquerais pas bien sûr de poster une réponse pour faire profiter tous le monde de cette modeste expérience.

    Cordialement


    BRI67
    samedi 14 mai 2011 13:07
  • Comme l’a souhaité Ciprian DUDUIALA, voici les résultats auxquels  je suis arrivé sur le sujet « Objet Solution ». L’objectif étant de permettre certaines impressions sélectives non prévu dans la fonction de l’IDE, dans le but d’économiser du papier.

    Pour cela j’avais besoin d’accéder à l’objet solution très souvent appelé « Objet Automation ».

    Bon nombre de documentation MSDN explique comment accéder à cet objet via un complément (AddIn) ou un assistant (Wizard) avec quelques exemples succincts, voire aussi dans des Macros.

    Néanmoins certains documents comme http:/msdn.microsoft.com/fr-fr/library/yf86a8ts.aspx mentionnent bien : « Pour accéder aux objets Automation en dehors des macros et des compléments ….. ».

    Il est donc normalement possible d’accéder à l’Objet Automation Solution dans un complément et dans un projet standard.

    Concernant la solution complément, que j’ai testé en premier, c’est l’article de raviraj bhalerao sur www.c-sharpcorner qui me parait le plus pertinent et surtout le plus complet en termes d’exemple de code.

    Le premier problème rencontré est tout simplement la création du complément qui n’est pas possible avec Visual C# 2010 Express et j’ai donc utilisé Visual Studio 2005 team Edition for Software developers.

    Je peux transmettre l’ensemble du code si cela peut être utile à d’autres.

    Principales difficultés :

    -       La gestion des exceptions, il faut utiliser moultes try/catch.

    -       Nombre de Collection ne sont pas indexable et il faut donc utiliser des boucles foreach .

    -       Après avoir lancé l’IDE et après une utilisation du Complément, la Génération suivante provoque un message d’erreur :

    « Impossible de copier le fichier "obj\Debug\PrtSolBH.dll" vers "bin\PrtSolBH.dll". Le processus ne peut pas accéder au fichier 'bin\PrtSolBH.dll', car il est en cours d'utilisation par un autre processus.          PrtSolBH.

    En effet après l’exécution du complément, quelques soit les valeurs de « LoadBehavior », « CommandPreload », et même en utilisant .connected = false, le complément n’est pas déchargé ou du moins le fichier Dll reste verrouillé par l’IDE.

    J’ai solutionné le problème en arrêtant et redémarrant. L’IDE

    Je suis preneur de toute solution.

     

    Quelques exemples et partie de code :

    -       Création de l’Objet Solution (dans la procédure « OnConnection » de la Class « Connect »)

    public DTE2 _applicationObject;

    public AddIn _addInInstance

    public void OnConnection(object application, ext_ConnectMode connectMode,

                             object addInInst, ref Array custom

    {

    _applicationObject = (DTE2)application;

    myDTE = (DTE2)application;

    _addInInstance = (AddIn)addInInst;

    Etc..

     

    -       La procédure « Exec » de la Class « Connect »

    public class Connect : IDTExtensibility2, IDTCommandTarget

        public void Exec(string commandName, vsCommandExecOption executeOption,

                         ref object varIn, ref object varOut, ref bool handled)

        //  Implémente la méthode Exec de l'interface IDTCommandTarget.

        //  Celle-ci est appelée en même temps que la commande.

        //  Le paramètre 'commandName' est le nom de la commande à exécuter.

        //  Le paramètre 'executeOption' décrit la manière dont la commande doit être

        //  exécutée.

        //  Le paramètre 'varIn' est le paramètre passé de l'appelant au gestionnaire de

        //  commandes.

        //  Le paramètre 'varOut' est le paramètre passé du gestionnaire de commandes à

        //  l'appelant.

        //  Le paramètre 'handled' indique à l'appelant si la commande a ou non été

        //  gérée.

        {

            handled = false;

            if (executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)

            {

                if (commandName == "PrtSolBH.Connect.PrtSolBH")

                {

                    myAddins = myDTE.AddIns;

                    if (myAddins.Count == 0)

                    {

                        MessageBox.Show("PrtSolBH - Erreur Interne, Addins.Count = 0");

                        return ;

                    }

                    myAddinFound = false;

                    foreach (AddIn AI in myAddins)

                    {

                        if (AI.Name == "PrtSrcBH")

                        {

                            myAddin = AI;

                            myAddinFound = true;

                            break;

                        }

                    }

                    if (!myAddinFound)

                    {

        MessageBox.Show("PrtSolBH - Erreur Interne, Complément introuvable

                          dans Addins");

                         eturn;

                    }

                    mySolName =

             myDTE.Solution.FullName.Substring(myDTE.Solution.FullName.LastIndexOf('\\') + 1,

                    myDTE.Solution.FullName.Length –

                    myDTE.Solution.FullName.LastIndexOf('\\') - 1);

                    if (myDTE.Solution.Count == 0)

                    {

                        MessageBox.Show(@"PrtSolBH - Vous devez ouvrir une solution pour

                        utiliser ce complément");

                        return;

                    }

                    if (myDTE.Solution.Projects.Count == 0)

                    {

                        MessageBox.Show(@"PrtSolBH - La solution """ +

                                        myDTE.Solution.FullName + @"""" +

                                        " n'a pas de projet " );

                        return;

                    }

                    if (myDTE.Solution.Projects.Count > nbProjetsMax)

                    {

                        MessageBox.Show(@"PrtSolBH - La solution """ +

                                        myDTE.Solution.FullName + @"""" +

                                        " a plus de " + nbProjetsMax.ToString() + "

                                        projets " );

                        return;

                    }

                    if (myPSBH == null)

                    {

                        myPSBH = new PrtSrcBH();

                        myPSBH.FormClosing += new FormClosingEventHandler(ClosePrtSrcBH);

                    }

                    myPSBH.ShowDialog();

                    //  Fin du complément

                    try

                    {

                        myAddin.Connected = false;

                    }

                    catch (Exception ex)

                    {

                        MessageBox.Show(@"PrtSolBH - Exec - Echec myAddin.Connected =

                                        false" +

                                        Environment.NewLine +

                                        "Code erreur = " + ex.ToString() +

                                        Environment.NewLine +

                                        "Message d'erreur = " + ex.Message);

                    }

                    handled = true;

                    return;

                }

            }

     Suite dans la réponse suivante.


    BRI67
    jeudi 7 juillet 2011 14:00
  • Bonjour,

     

    Merci pour tenir la communauté informée sur la suite de vos démarches.

     

    Bonne journée,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    jeudi 7 juillet 2011 14:02
  • Réponse suite :

     

    Analyse de la solution (liste les projets de la Solution pour être affiché dans un TreeView)

          public void AnalyseSolution()

          //  -------------------------------------------------------------------

          //  Analyse de la Solution : Liste des Projets.

          //  -------------------------------------------------------------------

          {

              nbProjects = Connect.myDTE.Solution.Projects.Count;

              indexProject = 0;

              //  Boucle sur les Projets de la solution

              foreach (Project myProject in Connect.myDTE.Solution.Projects)

              {

                  if (myProject.ProjectItems.Count > Connect.nbProjetItemsMax)

                  {

                      MessageBox.Show(@"PrtSolBH - exec - commandName - Le projet """ +

                                      myProject.Name + @"""" +

                                      " a plus de " + Connect.nbProjetItemsMax.ToString() +

                                      " Items ");

                      return;

                  }

                  listProjects[indexProject] = myProject.Name;

                  myProjects[indexProject] = myProject;

                  nbProjectItems[indexProject] = myProject.ProjectItems.Count;

                  indexProjectItem = 0;

                  foreach (ProjectItem myProjectItem in myProject.ProjectItems)

                  {

                      listProjectItems[indexProject, indexProjectItem] =

                            myProjectItem.Name;

                            myProjectItems[indexProject, indexProjectItem] = myProjectItem;

                      indexProjectItem++;

                  }

                    indexProject++;

                }

                label1.Text = @"Chemin Complet de la Solution  : """ +

                              Connect.myDTE.Solution.FullName + @"""";

                label2.Text = "Nom du fichier Solution : " + Connect.mySolName;

                label1.Visible = true;

                label2.Visible = true;

                pathSolution = Connect.myDTE.Solution.FullName.Substring(0,

                               Connect.myDTE.Solution.FullName.LastIndexOf('\\') + 1);

                //  Création du TreeViewSolution avec la liste des projets de la solution.

                treeViewSolution.Nodes.Clear();

                treeViewSolution.Nodes.Add(Connect.mySolName);

     

                for (int i = 0; i < nbProjects; i++)

                {

                    treeViewSolution.Nodes[0].Nodes.Add(listProjects[i]);

                    for (int j = 0; j < nbProjectItems[i]; j++)

                        treeViewSolution.Nodes[0].Nodes[i].Nodes.Add(listProjectItems[i, j]);

                }

     

                treeViewSolution.ExpandAll();

                groupBoxProjets.Visible = true;

     

            }


    BRI67
    jeudi 7 juillet 2011 14:04
  •  

    Réponse suite :

     

    Analyse du projet sélectionné

     

            public void AnalyseElementProjet()

            //  -------------------------------------------------------------------

            //  Analyse de la Solution : Liste des Projets.

            //  Déclenché par TreeViewSolutionOnAfterSelect.

            //  -------------------------------------------------------------------

            {

               

                nbBlocs = 0;

                //  Analyse du ProjetcItem sélectionné.

                //  Recherche du Projet et Element de Projet sélectionnés dans les

     //  listes créées.

                indexProject = -1;

                indexProjectItem = -1;

                for (int i = 0; i < nbProjects; i++)

                    if (listProjects[i] == myProjectSelected)

                    {

                        indexProject = i;

                        break;

                    }

                if (indexProject == -1)

                {

                    TSSMsg.Text = "Erreur Interne - Projet sélectionné introuvable dans la

                                  liste des projets";

                    return;

                }

                for (int i = 0; i < nbProjectItems[indexProject]; i++)

                    if (listProjectItems[indexProject, i] == myProjectElementSelected)

                    {

                        indexProjectItem = i;

                        break;

                    }

                if (indexProjectItem == -1)

                {

                    TSSMsg.Text = "Erreur Interne - Element de Projet sélectionné introuvable

                                   dans la liste des projets";

                    return;

                }

                //  Création de l'Objet myProjectItem

                myProjectItem = myProjectItems[indexProject, indexProjectItem];

                TSSMsg.Text = @"Element de projet """ + myProjectElementSelected + @""" du

                              projet """ + myProjectSelected + @""" Sélectionné " +

                              "(" + indexProject + "-" + indexProjectItem + ")" ;

                //  Si le ProjectItem n'est pas ouvert, Il faut l'ouvrir et vérifier que

                 //  l'ouverture c'est bien effectuée.

                if (!myProjectItem.get_IsOpen(EnvDTE.Constants.vsViewKindCode))

                {

                    try

                    {

                        myProjectItem.Open(EnvDTE.Constants.vsViewKindCode);

                    }

                    catch (Exception ex)

                    {

                        MessageBox.Show("PrtSolBH - " + Environment.NewLine +

                                        "Echec sur

                                       myProjectItem.Open(EnvDTE.Constants.vsViewKindCode)" +

                                        Environment.NewLine +

                                        "Code erreur : " + ex.ToString() +

                                        Environment.NewLine +

                                        "Message d'erreur : " + ex.Message);

                        return;

                    }

                    if (!myProjectItem.get_IsOpen(EnvDTE.Constants.vsViewKindCode))

                    {

                        MessageBox.Show("PrtSolBH - " + Environment.NewLine +

                                        @"Ouverture de """ + myProjectItem.Name + @"""" +

                                        " impossible");

                        return;

                    }

                }

                pathFile = pathSolution + myProjectItem.Name;

                //  Création de l'Objet Document correspondant au projectitem

                try

                {

                    myDoc = Connect.myDTE.Documents.Item(myProjectItem.Name);

                }

                catch(Exception ex)

                {

                    MessageBox.Show("PrtSolBH - " + Environment.NewLine +

                                    "Echec sur myDoc = Connect.myDTE.Documents.Item(" +

                                    myProjectItem.Name + ");" + Environment.NewLine +

                                    "Code erreur : " + ex.ToString() + Environment.NewLine +

                                    "Message d'erreur : " + ex.Message);

                    return;

                }

                //  Création de l'Objet TextSelection pour le document

                try

                {

                    myTextSel = (TextSelection)myDoc.Selection;

                }

                catch (Exception ex)

                {

                    MessageBox.Show("PrtSolBH - " + Environment.NewLine +

                                    "Echec sur myTextSel = (TextSelection)myDoc.Selection;" +

                                    "Code erreur : " + ex.ToString() + Environment.NewLine +

                                    "Message d'erreur : " + ex.Message);

                    return;

                }


    BRI67
    jeudi 7 juillet 2011 14:10
  • Réponse suite :

     

     

                //  Sélection de tout le document

                try

                {

                    myTextSel.SelectAll();

                }

                catch (Exception ex)

                {

                    MessageBox.Show("PrtSolBH - " + Environment.NewLine +

                                    "Echec sur myTextSel.SelectAll();" +

                                    "Code erreur : " + ex.ToString() + Environment.NewLine +

                                    "Message d'erreur : " + ex.Message);

                    return;

                }

                //  Création de l'Objet TextRanges du Document

                try

                {

                    myTextRanges = myTextSel.TextRanges;

                }

                catch (Exception ex)

                {

                    MessageBox.Show("PrtSolBH - " + Environment.NewLine +

                                    "Echec sur myTextRanges = myTextSel.TextRanges;" +

                                    "Code erreur : " + ex.ToString() + Environment.NewLine +

                                    "Message d'erreur : " + ex.Message);

                    return;

                }

     

                //  Longueur du Text du Document

                myTextSelLength = myTextSel.Text.Length;

     

                //  Création tabSource contenant toutes les lignes du ProjetItem.

                tabSource = myTextSel.Text.Split(stringSeparators, StringSplitOptions.None);

     

                //  Initialisation tabBlocs pour le ProjectItem Global

                tabBlocsName[nbBlocs, 0] = "Global";

                tabBlocsName[nbBlocs, 1] = myProjectElementSelected;

                tabBlocs[nbBlocs, 0] = 1;

                tabBlocs[nbBlocs, 1] = tabSource.Length;

                nbBlocs++;

     

                //  Création de l'Objet myFileCodeModel = myProjectItem.FileCodeModel;

                try

                {

                    myFileCodeModel = myProjectItem.FileCodeModel;

                }

                catch (Exception ex)

                {

                    MessageBox.Show("PrtSolBH - " + Environment.NewLine +

                                    "Echec sur myFileCodeModel =

                                    myProjectItem.FileCodeModel;" +

                                    "Code erreur : " + ex.ToString() + Environment.NewLine +

                                    "Message d'erreur : " + ex.Message);

                    return;

                }

     

                switch (myProjectItem.Kind)

                {

                    case EnvDTE.Constants.vsProjectItemKindMisc:

                        break;

                    case EnvDTE.Constants.vsProjectItemKindPhysicalFile:

                        //  Inutile de tester .cs car on ne traite que les .cs pour le

                            moment.

                        //  Voir dans TreeViewSolutionOnAfterSelect

                        if (!LoadProjectItem(myProjectItem)) return;

                        break;

                    case EnvDTE.Constants.vsProjectItemKindPhysicalFolder:

                        break;

                    case EnvDTE.Constants.vsProjectItemKindSubProject:

                        break;

                }

               

                //  Il faut maintenant initialiser la ListViewBlocs

                InitListViewBlocs();

                listViewBlocs.Items.Clear();

                for (int i = 0; i < nbBlocs; i++) InitBloc(i);

                groupBoxBlocs.Visible = true;

                btnPrint.Visible = true;

     

            }


    BRI67
    jeudi 7 juillet 2011 14:12
  • Réponse Suite :

     La procédure LoadProjectItem

            public bool LoadProjectItem(ProjectItem prj)

            //  =============================================================================

            //  Traite d'un projet (ProjectItem)

            //  =============================================================================

            {

     

                //  Ouverture de ProjetItem si non ouvert

                if (!prj.get_IsOpen(EnvDTE.Constants.vsViewKindCode))

                {

                    try

                    {

                        prj.Open(EnvDTE.Constants.vsViewKindCode);

                    }

                    catch (Exception ex)

                    {

                        MessageBox.Show("PrtSolBH - LoadProjectItem - "

                        + Environment.NewLine +

                                        "Echec sur

                                        prj.Open(EnvDTE.Constants.vsViewKindCode);" +

                                        Environment.NewLine +

                                        "Code erreur : " + ex.ToString() +

                                        Environment.NewLine +

                                        "Message d'erreur: " + ex.Message);

                        return false;

                    }

                    if (!prj.get_IsOpen(EnvDTE.Constants.vsViewKindCode))

                    {

                      MessageBox.Show("PrtSolBH - LoadProjectItem - " + Environment.NewLine +

                                        @"Ouverture de """ + myProjectItem.Name + @"""" +

                                        " impossible");

                        return false;

                    }

                }

                indexCodeElement = 0;

                indexCodeElementNameSpace = 0;

                indexCodeElementClass = 0;

                indexCodeElementClassMember = 0;

                indexCodeElementInterface = 0;

                indexCodeElementDelegate = 0;

     

                try

                {

                    //  Boucle sur les "CodeElement" du "ProjetcItem".

                    foreach (CodeElement myCodeElement in prj.FileCodeModel.CodeElements)

                    {

                        //  Boucle sur chaque CodeElement de MyProjectItem.FileCodeModel

                        indexCodeElement++;

                        if (myCodeElement.Kind == vsCMElement.vsCMElementNamespace)

                        {

                            indexCodeElementNameSpace++;

                            myCodeNamespace = (CodeNamespace) myCodeElement;

                            myCodeElementNamespaceStartPoint =

                         myCodeNamespace.GetStartPoint(vsCMPart.vsCMPartWholeWithAttributes);

                            myCodeElementNamespaceEndPoint =

    myCodeNamespace.GetEndPoint(vsCMPart.vsCMPartWholeWithAttributes);

    myCodeElementNamespaceStartPointLine = myCodeElementNamespaceStartPoint.Line;

    myCodeElementNamespaceEndPointLine = myCodeElementNamespaceEndPoint.Line;

                            tabBlocsName[nbBlocs,0] = "Namespace";

                            tabBlocsName[nbBlocs,1] = myCodeNamespace.Name;

                            tabBlocs[nbBlocs, 0] = myCodeElementNamespaceStartPointLine;

                            tabBlocs[nbBlocs, 1] = myCodeElementNamespaceEndPointLine;

                            nbBlocs++;

                           

                 foreach (CodeElement myCodeElementClass in

                          ((CodeNamespace)myCodeElement).Members)

                            {

                                indexCodeElementClass++;

                                if (myCodeElementClass.Kind == vsCMElement.vsCMElementClass)

                                {

                                    myCodeElementClassStartPoint =

            myCodeElementClass.GetStartPoint(vsCMPart.vsCMPartWholeWithAttributes);

                                    myCodeElementClassEndPoint =

                       myCodeElementClass.GetEndPoint(vsCMPart.vsCMPartWholeWithAttributes);

                                    myCodeElementClassStartPointLine =  

                       myCodeElementClassStartPoint.Line;

                                    myCodeElementClassEndPointLine =

                       myCodeElementClassEndPoint.Line;

                                    tabBlocsName[nbBlocs,0] = "Class";

                                    tabBlocsName[nbBlocs,1] = myCodeElementClass.Name;

                                    tabBlocs[nbBlocs, 0] = myCodeElementClassStartPointLine;

                                    tabBlocs[nbBlocs, 1] = myCodeElementClassEndPointLine;

                                    nbBlocs++;

                                    LoadClassMembers((CodeClass)myCodeElementClass);

                                    continue;

                                }

                                if (myCodeElementClass.Kind ==

                                    vsCMElement.vsCMElementInterface)

                                {

                                    indexCodeElementInterface++;

                                    //  loadInterfaceMembers((CodeInterface)myCodeElementClass);

                                    continue;

                                }

                                if (myCodeElementClass.Kind == vsCMElement.vsCMElementDelegate)

                                {

                                    indexCodeElementDelegate++;

                                    //  loadDelegateMembers(interfaceNode,(CodeDelegate)myCodeElementClass);

                                    continue;

                                }

                                //  De la même manière on peut traiter les codes pour les "Enumérations"

                                //  et les "Structures".

                            }

                        }

                        indexCodeElement++;

                    }

                }

                catch (Exception ex)

                {

                    MessageBox.Show("PrtSolBH - LoadProjectItem - Erreur dans boucle sur CodeElements" + Environment.NewLine +

                                    "Code erreur : " + ex.ToString() + Environment.NewLine +

                                    "Message d'erreur : " + ex.Message + Environment.NewLine +

                                    "indexCodeElement : " + indexCodeElement.ToString() + Environment.NewLine +

                                    "indexCodeElementClass : " + indexCodeElementClass.ToString() );

     

                    return false;

                }

                //  Fin de la boucle sur les CodeElement du projetcItem

                return true;

            }


    BRI67
    jeudi 7 juillet 2011 14:14
  • Réponse Suite :

    La procédure LoadClassMembers

            private void LoadClassMembers(CodeClass cdClass)

            {

     

                indexCodeElementClassMember = 0;

                nbElementFunction = 0;

                nbElementVariable = 0;

                nbElementProperty = 0;

                nbElementDelegate = 0;

                nbElementEnum = 0;

                nbElementStruct = 0;

                nbElementOther = 0;

     

                foreach (CodeElement myCodeElementClassMember in cdClass.Members)

                {

                    indexCodeElementClassMember++;

                    if (myCodeElementClassMember.Kind == vsCMElement.vsCMElementFunction)

                    {

                        nbElementFunction++;

                        loadFunctionParameters((CodeFunction)myCodeElementClassMember);

                    }

                    else if (myCodeElementClassMember.Kind ==

                             vsCMElement.vsCMElementVariable)

                    {

                        nbElementVariable++;

                    }

                    else if (myCodeElementClassMember.Kind ==

                             vsCMElement.vsCMElementProperty)

                    {

                        nbElementProperty++;

                        //  LoadProperty(propNode, (CodeProperty)cdElement);

                    }

                    else if (myCodeElementClassMember.Kind ==

                             vsCMElement.vsCMElementDelegate)

                    {

                        nbElementDelegate++;

                    }

                    else if (myCodeElementClassMember.Kind == vsCMElement.vsCMElementEnum)

                    {

                        nbElementEnum++;

                    }

                    else if (myCodeElementClassMember.Kind == vsCMElement.vsCMElementStruct)

                    {

                        nbElementStruct++;

                    }

                    else

                    {

                        nbElementOther++;

                    }

                    //  On peut traiter les autres "Elements".

                }

            }


    BRI67
    jeudi 7 juillet 2011 14:16
  • Réponse Suite :

     

    La procédure LoadFunctionParameters

            private void loadFunctionParameters(CodeFunction cdFunc)

            {

                Int32 parametersCount = 0;

     

                tabBlocsName[nbBlocs, 0] = "Function";

                foreach (CodeAttribute cdAttr in cdFunc.Attributes)

                {

                    if (cdAttr.Name == "DllImport")

                        tabBlocsName[nbBlocs, 0] = "DllImport";

                }

                foreach (CodeParameter cdParam in cdFunc.Parameters)

                {

                    parametersCount++;

                }

                myCodeElementFunctionStartPoint =

                           cdFunc.GetStartPoint(vsCMPart.vsCMPartWholeWithAttributes);

                myCodeElementFunctionEndPoint =

                           cdFunc.GetEndPoint(vsCMPart.vsCMPartWholeWithAttributes);

                myCodeElementFunctionStartPointLine = myCodeElementFunctionStartPoint.Line;

                myCodeElementFunctionEndPointLine = myCodeElementFunctionEndPoint.Line;

                tabBlocsName[nbBlocs,1] = cdFunc.Name;

                tabBlocs[nbBlocs, 0] = myCodeElementFunctionStartPointLine;

                tabBlocs[nbBlocs, 1] = myCodeElementFunctionEndPointLine;

     

                nbBlocs++;

               

            }


    BRI67
    jeudi 7 juillet 2011 14:17
  • Réponse Suite :

    La procédure gérant l’évènement PrintPage :

            private void pd_PrintPage(object sender, PrintPageEventArgs ev)

            //  -------------------------------------------------------------------

            //  Impression d'une page.

            //  -------------------------------------------------------------------

            {

               

                float linesPerPage = 0;

                Int32 charsPerLine = 0;

                float yPos = 0;

                int count = 0;

     

                //  Valeurs de base

                float leftMargin = ev.MarginBounds.Left;

                float topMargin = ev.MarginBounds.Top;

                float pageWidth = ev.PageBounds.Width;

                float pageHeight = ev.PageBounds.Height;

                float rigthMargin = pageWidth - ev.MarginBounds.Right;

                float bottomMargin = pageHeight - ev.MarginBounds.Bottom;

     

                //  valeurs utilisées

                float leftMarginUse = leftMargin / 2;

                float topMarginUse = topMargin / 2;

                float rigthMarginUse = rigthMargin / 4;

                float bottomMarginUse = bottomMargin / 2;

                float pageWidthUse = pageWidth - rigthMarginUse - leftMarginUse;

                float pageHeightUse = pageHeight - bottomMarginUse - topMarginUse;

     

                String line1 = null;

                String line2 = null;

                String line3 = null;

                String line4 = null;

                String numLine;

                SD.Font printFont = new SD.Font("Consolas", 8.5F);

                SD.Font printFont2 = new SD.Font("Consolas", 8.5F, FontStyle.Bold |

                                                 FontStyle.Underline);

                SD.Font printFont3 = new SD.Font("Consolas", 8.5F, FontStyle.Bold);

                Int32 LL;

                SizeF stringSize1 = new SizeF();

                SizeF stringSize2 = new SizeF();

                SizeF stringSize3 = new SizeF();

                String measureString1;

                String measureString2;

     

                // Calcul du nombre de lignes par page.

     

                linesPerPage = pageHeightUse / printFont.GetHeight(ev.Graphics);

     

                // Calcul du nombre de caractères par ligne.

     

                stringSize1 = SizeF.Empty;

                stringSize2 = SizeF.Empty;

                stringSize3 = SizeF.Empty;

                measureString1 = "A";

                measureString2 = "AA";

                stringSize1 = ev.Graphics.MeasureString(measureString1, printFont);

                stringSize2 = ev.Graphics.MeasureString(measureString2, printFont);

                charsPerLine = (int)((pageWidthUse - stringSize1.Width) / (stringSize2.Width

                                      - stringSize1.Width)) + 1;

     

                //  Titres de la Page

                if (pageBlanche)

                {

                    iPage++;

                    linePage1 = "    ";

                    yPos = topMarginUse + (count * printFont.GetHeight(ev.Graphics));

                    ev.Graphics.DrawString(linePage1, printFont, Brushes.Black,

                       leftMarginUse, yPos, new StringFormat());

                    count++;

                }

                else

                {

                    iPage++;

                    linePage1 = pathFile.PadRight(charsPerLine - 10, 'A');

                    linePage2 = iPage.ToString().PadRight(4);

                    stringSize1 = ev.Graphics.MeasureString("AAAAA", printFont);

                    stringSize2 = ev.Graphics.MeasureString("AAAAAA", printFont);

                    stringSize3 = ev.Graphics.MeasureString(linePage1, printFont);

     

                    yPos = topMarginUse + (count * printFont.GetHeight(ev.Graphics));

                    ev.Graphics.DrawString(pathFile, printFont2, Brushes.Red,

                       leftMarginUse + stringSize1.Width, yPos, new StringFormat());

     

                    yPos = topMarginUse + (count * printFont.GetHeight(ev.Graphics));

                    ev.Graphics.DrawString(linePage2, printFont, Brushes.Red,

                       leftMarginUse + stringSize1.Width + stringSize3.Width, yPos, new

                                     StringFormat());

                    count++;

     

                    yPos = topMarginUse + (count * printFont.GetHeight(ev.Graphics));

                    ev.Graphics.DrawString(" ", printFont, Brushes.Black,

                       leftMarginUse, yPos, new StringFormat());

                    count++;

                }

     

                // Boucle sur le code Source du Bloc et impression de chaque ligne.

                while (count < linesPerPage && iLine < nbBlocSource)

                {

                    numLine = (iDeb + iLine).ToString();

                    line1 = numLine.PadLeft(5) + "  ";

                    line2 = tabBlocSource[iLine];

     

                    LL = line2.Length;

                    if (LL > charsPerLine - 6)

                    {

                        line3 = line2.Substring(0, charsPerLine - 10) + "  " + FLS + FLR;

                        line4 = "          " + line2.Substring(charsPerLine - 10, LL –

    charsPerLine + 10);

                    }

                    else line3 = line2;

     

                    if (iLine == 0)

                    {

                        yPos = topMarginUse + (count * printFont.GetHeight(ev.Graphics));

                        ev.Graphics.DrawString(line1, printFont, Brushes.Black,

                           leftMarginUse, yPos, new StringFormat());

     

                        yPos = topMarginUse + (count * printFont.GetHeight(ev.Graphics));

                        ev.Graphics.DrawString(line3, printFont3, Brushes.Blue,

                           leftMarginUse + stringSize2.Width, yPos, new StringFormat());

                    }

                    else

                    {

                        yPos = topMarginUse + (count * printFont.GetHeight(ev.Graphics));

                        ev.Graphics.DrawString(line1 + line3, printFont, Brushes.Black,

                           leftMarginUse, yPos, new StringFormat());

                    }

     

                    iLine++;

                    count++;

     

                    if (LL > charsPerLine - 6)

                    {

                        yPos = topMarginUse + (count * printFont.GetHeight(ev.Graphics));

                        ev.Graphics.DrawString(line4, printFont, Brushes.Black,

                           leftMarginUse, yPos, new StringFormat());

                        count++;

                    }

                }

     

                //  S'il y a d'autres lignes, il faut imprimer une autre page.

                if (iLine < nbBlocSource - 1)

                    ev.HasMorePages = true;

                else

                {

                    //  On vient d'imprimer la dernière page d'un Bloc (index iBloc).

                    //  Si c'est une impression Duplex il faut vérifier que le dernier numéro

                        de Page est pair.

                    //  Sinon il faut imprimer une bage Blanche.

     

                    if (iPage - ((iPage / 2) * 2) > 0)

                    {

                        //  Nombre de Page Impaire, il faut imprimer une page Blanche

                        ev.HasMorePages = true;

                        pageBlanche = true;

                        return;

                    }

     

                    //  On passe au Bloc suivant à imprimer

                    iBloc++;

                    if (iBloc == nbBlocsToPrint)

                        ev.HasMorePages = false;        //  C'était le dernier Bloc

                    else

                    {

                        InitTabBlocSource(iBloc);       //  Nouveau Bloc

                        ev.HasMorePages = true;

                    }

                }

            }

     


    BRI67
    jeudi 7 juillet 2011 14:18
  • Les problèmes que je n’ai pas résolus à ce jour :

     

    -       TextRange de la Collection TextRanges ????

    -       Comment installer ce complément dans Visual C# 2010 Express ????

    -       Le fichier PrtSolBH.Dll verrouillé après une exécution du complément ????

    -       L’utilisation de L’objet d’Automation Solution dans un projet standard, comme indiqué dans http://msdn.microsoft.com/fr-fr/library/68shb4dw.aspx

    // Get an instance of the currently running Visual Studio IDE.

    EnvDTE80.DTE2 dte2;

    dte2 = EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0");

    Qui ne marche pas avec Visual C# 2010 Express. Je pense que le ProgID n’est pas bon pour Visual C# 2010 Express et le ProgID « VisualStudio.DTE » comme indiqué dans certaines documentations pour toute version supérieure à la version 9.0 ne marche pas.

    -       Une fois le Complément terminé ou faut-il installé la Dll correspondante ?

    Si quelqu’un a les solutions je suis preneur.

     

    Cordialement.


    BRI67
    jeudi 7 juillet 2011 14:19