Partager via


Dépannage de l'extensibilité Visual Basic et Visual C#

Les techniques suivantes permettent de résoudre certains problèmes d'extensibilité courants que vous pourriez rencontrer dans le cadre du développement d'une application d'extensibilité pour un projet Visual Basic ou Visual C#.

Si votre problème n'apparaît pas dans cette liste, consultez MSDN Online Support https://support.microsoft.com/?ln=fr&x=6&y=15 pour plus d'informations.

Les méthodes Add et Remove du CodeModel ne fonctionnent pas

Les méthodes Add et Remove des différentes classes de l'objet CodeModel2 ne sont pas prises en charge dans les projets Visual Basic.Si vous appelez l'une de ces méthodes, vous obtiendrez une erreur "Non implémenté".Les méthodes non prises en charge sont les suivantes :

AddAttribute

AddBase

AddClass

AddDelegate

AddEnum

AddFunction

AddImplementedInterface

AddInterface

AddNameSpace

AddParameter

AddProperty

AddStruct

AddVariable

RemoveInterface

RemoveMember

RemoveMethod

RemoveParameter

 

Pour ajouter des éléments de code à votre application par le biais d'une macro, utilisez les fonctionnalités d'édition de texte du modèle d'extensibilité.Pour plus d'informations, consultez Comment : utiliser une macro pour ajouter du texte dans un éditeur de code Visual Basic ou C# qui contient un exemple d'ajout de code à un fichier source.Le modèle d'extensibilité générale Visual Studio contient plusieurs objets utiles pour la lecture et la modification du code source.Il s'agit notamment des objets Document, TextDocument, EditPoint, TextPoint et VirtualPoint.

Je ne peux pas modifier les propriétés des objets CodeModel.

La plupart des propriétés présentes dans CodeModel2 sont implémentées en tant que champs en lecture seule pour les projets Visual Basic.Si vous tentez de définir une propriété au moment de l'exécution, vous obtiendrez une erreur "Non implémenté".Les propriétés en lecture seule comprennent :

Accès

CanOverride

Commentaire

DocComment

Getter

InitExpression

IsAbstract

IsConstant

IsShared

MustImplement

Setter

 

Pour modifier la valeur d'une propriété d'un objet CodeModel2, modifiez la définition de l'élément de code dans le fichier source.Vous pouvez le faire de deux façons :

Les appels à un objet CodeElement échouent.

Les appels à un objet CodeModel2 échouent si le projet est modifié après la création d'une référence au CodeModel2.Par exemple, une application d'extensibilité peut être exécutée dans l'environnement de développement.L'application peut avoir récupéré une instance CodeModel2 pour l'une des classes définies dans le projet.Un utilisateur peut alors supprimer la classe dans l'environnement de développement.Les appels suivants au CodeModel2 pour cette classe échouent car la classe n'existe plus dans le projet.

Aucune propriété ne peut être testée pour déterminer si une référence est toujours valide.Vous pouvez éviter ces problèmes en utilisant des méthodes de programmation fiables.

Je souhaite éditer mon code macro dans un éditeur de texte.

L'édition de votre fichier de macros dans un éditeur de texte peut s'avérer nécessaire.Pour enregistrer votre fichier de macros en texte brut, ouvrez le menu Fichier, puis cliquez sur la commande Exporter.Lorsque la boîte de dialogue Exporter le fichier s'affiche, entrez le nom du fichier d'exportation que vous souhaitez créer.Le fichier sera enregistré en tant que fichier source Visual Basic avec l'extension .vb.

La commande Ajouter un élément existant dans le menu Fichier vous permet d'ajouter un fichier source Visual Basic à votre projet macro.

Pour plus d'informations, consultez Managing Macros.

Des messages sur des éléments non disponibles s'affichent.

Un objet peut afficher un ensemble de messages d'erreur si la structure du projet est modifiée alors que votre code contient une référence à l'un des objets d'extensibilité.Cette situation peut se produire dans les cas suivants :

  • Un projet est fermé dans l'environnement de développement.Dans ce cas, sa référence de Project n'est plus valide, comme tous les objets du projet.Si vous utilisez cette référence de Project, par exemple pour ajouter un fichier, la méthode échoue.Par exemple, la macro suivante retourne "Projet non disponible" lors d'une tentative d'accès à proj.Name :

    ' Macro editor
    Public Sub AccessAClosedProject()
       Dim proj As Project = DTE.Solution.Projects.Item(1)
       DTE.Solution.Close()
       MsgBox(proj.Name)
    End Sub
    
  • Un fichier est supprimé du projet.Par exemple, la macro suivante retourne "Projectitem non disponible" lors d'une tentative d'accès à projItem.Name :

    ' Macro editor
    Public Sub AccessADeletedFile()
       Dim proj As Project = DTE.Solution.Projects.Item(1)
       Dim projItem As ProjectItem = proj.ProjectItems.Item(1)
       proj.ProjectItems.Item(1).Delete()
       MsgBox(projItem.Name)
    End Sub
    
  • Une référence est supprimée du projet.Par exemple, la macro suivante retourne "Le serveur a généré une exception" lors d'une tentative d'accès à ref.Name :

    ' Macro editor
    Public Sub AccessARemovedReference()
       Dim vsproj As VSProject = _
          CType(DTE.Solution.Projects.Item(1).Object, VSProject)
       Dim ref As Reference = vsproj.References.Item(1)
       vsproj.References.Item(1).Remove()
       MsgBox(ref.Name)
    End Sub
    
  • Le contrôle de code source change suite à un rechargement du projet.Dans ce cas, les anciens objets ne sont plus valides.Par exemple, un rechargement se produit si vous extrayez le fichier projet alors qu'une nouvelle version existe dans la base de données contenant le contrôle de code source.De même, un rechargement aura lieu si vous archivez le fichier projet et s'il doit être fusionné avec les fichiers du contrôle de code source.

  • Un élément de projet est enregistré par le biais de la commande Enregistrer sous.Cette opération crée un objet ProjectItem pour le fichier.L'objet d'origine n'est plus valide.

  • Le projet doit être rechargé pour une raison quelconque.

Aucune propriété ne peut être testée pour déterminer si une référence à un projet ou à un élément de projet est toujours valide.Les erreurs correspondantes retournées par certaines propriétés et méthodes d'un objet indiquent qu'elle n'est plus valide.Vous pouvez éviter ces problèmes en utilisant des méthodes de programmation fiables.

Je souhaite créer un projet sans qu'aucun message d'erreur n'apparaisse.

Lorsque vous utilisez la méthode AddFromFile, différentes boîtes de dialogue s'affichent en cas d'erreurs lors de la création du projet.La méthode LaunchWizard peut être utilisée pour créer des projets et supprimer l'interface utilisateur.Par défaut, lorsque LaunchWizard est appelé pour créer un projet à partir d'un projet d'extensibilité, les erreurs s'affichent dans des boîtes de message.

La méthode LaunchWizard accepte deux arguments lors de l'exécution de l'Assistant Nouveau projet.Le premier argument est le nom du fichier Assistant (fichier .vsz).Le second argument est un tableau de valeurs passé à l'Assistant lorsque celui-ci est exécuté.En attribuant la valeur true au septième élément du tableau, vous pouvez forcer les erreurs à lever des exceptions qui peuvent alors être interceptées dans une structure Try...Catch.L'Assistant Nouvelle application Windows attend les valeurs suivantes dans le tableau :

Index du tableau

Valeur

0

WizardType, identificateur GUID indiquant le type de l'Assistant.Pour l'Assistant Nouveau projet, l'indicateur GUID est "{0F90E1D0-4999-11D1-B6D1-00A0C90F2744}".

1

ProjectName, chaîne pour le nom du nouveau projet.

2

Local directory, chaîne contenant le chemin d'accès complet du dossier dans lequel le projet sera créé.

3

Répertoire d'installation, chaîne contenant le dossier dans lequel Visual Studio est installé.

4

Exclusive, valeur booléenne indiquant si une éventuelle solution ouverte doit être fermée.

5

Solution name, nom de chaîne pour le fichier de solution, sans chemin d'accès ni extension.

6

Silent, valeur booléenne indiquant si l'Assistant doit être exécuté de manière silencieuse.

La macro suivante montre comment utiliser l'indicateur Silent lors de l'appel à l'Assistant.Si vous n'avez exécuté cette macro qu'une seule fois, elle doit s'exécuter sans erreur, si le répertoire et le projet n'existaient pas déjà.Si vous avez exécuté cette macro une seconde fois, une erreur doit se produire.Comme l'indicateur Silent a la valeur true, une exception est interceptée par le bloc Try...Catch.

' Macro editor
Sub RunLaunchWizard()
   Dim params() As Object = New Object() { _
      "{0F90E1D0-4999-11D1-B6D1-00A0C90F2744}", _
      "NewProjectName", _
      "NewProjectPath", _
      "", _
      False, _
      "", _
      True}  ' -->  This is the "Silent" flag ... TRUE=No UI, FALSE=UI
   Dim res As EnvDTE.wizardResult
   Dim s As String = _
      DTE.Solution.TemplatePath(VSLangProj.PrjKind.prjKindVBProject)

   Try
      res = DTE.LaunchWizard(s & "WindowsApplication.vsz", params)
   Catch e1 As System.Exception
      MsgBox("Cannot create new project.")
   End Try
End Sub

Qu'est-ce que HRESULT : 0x80047E2C ?

Cette erreur peut se produire lorsque vous manipulez les objets CodeModel2 des fichiers sources Visual Basic.

Lorsque vous rédigez un code qui comporte des références à des objets CodeElement2, sachez que le code source sous-jacent référencé peut changer.L'élément de code element peut être supprimé, renommé ou impliqué dans une erreur de compilation.Alors, tous les appels à l'objet CodeElement2 retournent le message d'erreur "Exception à partir de HRESULT : 0x80047E2C".

Dès qu'une référence est devenue non valide à la suite de ce problème, elle ne peut plus être restaurée.Pour résoudre le problème, vous devez corriger les erreurs dans le code source et récupérer une nouvelle référence à partir de l'objet CodeModel2.

Les macros suivantes montrent comme une telle erreur peut se produire.Ajoutez une classe nommée LostClass à votre projet.Faites-en une classe de niveau supérieur, sans l'intégrer dans un espace de noms ou une autre classe.Exécutez la macro SetElement, supprimez la classe, puis exécutez la macro GetElement.Lorsque vous exécutez cette dernière, la classe n'existe plus, et la référence à lostClass devient non valide et retourne l'erreur en question.

Public Module CreateLostClass
    Dim lostClass As CodeElement

    Sub SetElement()
        Dim proj As Project = DTE.Solution.Projects.Item(1)
        lostClass = proj.CodeModel.CodeElements.Item("LostClass")
        MsgBox(lostClass.Name)
    End Sub

    Sub GetElement()
        MsgBox(lostClass.Name)
    End Sub
End Module

Voir aussi

Concepts

Introduction à l'extensibilité de projet