Problembehandlung hinsichtlich der Erweiterbarkeit von Visual Basic und Visual C#

Aktualisiert: November 2007

Es folgen eine Reihe von Techniken, mit denen einige der häufigsten Probleme im Hinblick auf die Erweiterbarkeit behoben werden können. Derartige Probleme können beim Entwickeln von Erweiterbarkeitsanwendungen für Visual Basic- oder Visual C#-Projekte auftreten.

Falls Ihr spezifisches Problem nicht in dieser Liste behandelt wird, erhalten Sie weitere Informationen beim MSDN Online Support unter https://support.microsoft.com/?in=de (auf Englisch).

Die Methoden Add und Remove im CodeModel sind nicht funktionsfähig.

Die Methoden Add und Remove der verschiedenen CodeModel2-Objektklassen werden in Visual Basic-Projekten nicht unterstützt. Wenn Sie eine dieser Methoden aufrufen, erhalten Sie eine Meldung "Nicht implementiert". Folgende Methoden werden nicht unterstützt:

AddAttribute

AddBase

AddClass

AddDelegate

AddEnum

AddFunction

AddImplementedInterface

AddInterface

AddNameSpace

AddParameter

AddProperty

AddStruct

AddVariable

RemoveInterface

RemoveMember

RemoveMethod

RemoveParameter

 

Um der Anwendung Codeelemente über ein Makro hinzuzufügen, können Sie die Textbearbeitungsfeatures des Erweiterbarkeitsmodells verwenden. Weitere Informationen finden Sie unter Gewusst wie: Verwenden eines Makros zum Hinzufügen von Text in einem Editor für Visual Basic- oder C#-Code. Dort finden Sie auch ein Beispiel zum Hinzufügen von Code zu einer Quelldatei. Das Modell mit allgemeiner Erweiterbarkeit von Visual Studio umfasst mehrere Objekte, die hilfreich beim Lesen und Ändern von Quellcode sind. Dazu zählen das Document-Objekt, das TextDocument-Objekt, das EditPoint-Objekt, das TextPoint-Objekt und das VirtualPoint-Objekt.

Die Eigenschaften der CodeModel-Objekte können nicht geändert werden.

Die meisten der Eigenschaften in CodeModel2 werden als schreibgeschützte Felder für Visual Basic-Projekte implementiert. Beim Versuch, eine Eigenschaft zur Laufzeit festzulegen, erhalten Sie eine Fehlermeldung "Nicht implementiert". Die schreibgeschützten Eigenschaften umfassen:

Access

CanOverride

Comment

DocComment

Getter

InitExpression

IsAbstract

IsConstant

IsShared

MustImplement

Setter

 

Um den Wert der Eigenschaft eines CodeModel2-Objekts zu ändern, können Sie die Definition des Codeelements in der Quelldatei ändern. Dazu gibt es zwei Möglichkeiten:

Aufrufe eines CodeElement-Objekts schlagen fehl.

Der Aufruf eines CodeModel2-Objekts schlägt fehl, wenn das Projekt geändert wird, nachdem ein Verweis auf CodeModel2 erstellt wurde. Angenommen, in der Entwicklungsumgebung wird eine Erweiterbarkeitsanwendung ausgeführt. Von dieser Anwendung wurde möglicherweise eine CodeModel2-Instanz für eine der im Projekt definierten Klassen abgerufen. Anschließend könnte ein Benutzer die Klasse in der Entwicklungsumgebung gelöscht haben. Nachfolgende Aufrufe von CodeModel2 für diese Klasse schlagen dann fehl, da die Klasse nicht länger im Projekt enthalten ist.

Es gibt keine Eigenschaft, die daraufhin überprüft werden kann, ob ein Verweis weiterhin gültig ist. Sie können diese Probleme vermeiden, indem Sie stabile Programmiermethoden verwenden.

Makrocode soll in einem Text-Editor bearbeitet werden.

In bestimmten Situationen muss die Makrodatei u. U. in einem Text-Editor bearbeitet werden. Um die Makrodatei als Textdatei zu speichern, klicken Sie im Menü Datei auf den Befehl Exportieren. Sobald das Dialogfeld Exportdatei angezeigt wird, geben Sie den Namen der zu erstellenden Exportdatei ein. Die Datei wird mit der Erweiterung .vb als Visual Basic-Quellcodedatei gespeichert.

Mithilfe des Befehls Vorhandenes Element hinzufügen im Menü Datei können Sie Ihrem Makroprojekt eine Visual Basic-Quellcodedatei hinzufügen.

Weitere Informationen finden Sie unter Gewusst wie: Verwalten von Makros.

Es werden Meldungen zu nicht verfügbaren Elementen ausgegeben.

Ein Objekt kann eine Vielzahl von Fehlermeldungen verursachen, wenn die Projektstruktur geändert wird, während der Code noch einen Verweis auf eines der Erweiterbarkeitsobjekte enthält. Dies kann in den folgenden Situationen auftreten:

  • Ein Projekt wird in der Entwicklungsumgebung geschlossen. In diesem Fall werden der Project-Verweis auf das Projekt genauso wie alle darin enthaltenen Objekte ungültig. Wenn Sie diesen Project-Verweis verwenden, z. B. zum Hinzufügen einer Datei zum Projekt, schlägt die Methode fehl. Das folgende Makro gibt beispielsweise beim Versuch, auf proj.Name zuzugreifen, die Fehlermeldung "Das Projekt ist nicht verfügbar" zurück:

    ' Macro editor
    Public Sub AccessAClosedProject()
       Dim proj As Project = DTE.Solution.Projects.Item(1)
       DTE.Solution.Close()
       MsgBox(proj.Name)
    End Sub
    
  • Eine Datei wurde aus dem Projekt gelöscht. Das folgende Makro gibt beispielsweise beim Versuch, auf projItem.Name zuzugreifen, den Fehler "Das Projektelement ist nicht verfügbar" zurück:

    ' 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
    
  • Ein Verweis wurde aus dem Projekt gelöscht. Das folgende Makro gibt beispielsweise beim Versuch, auf ref.Name zuzugreifen, die Meldung, dass ein Ausnahmefehler des Servers aufgetreten ist:

    ' 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
    
  • Das Projekt wird aufgrund von Änderungen in der Quellcodeverwaltung neu geladen. In diesem Fall werden die alten Objekte ungültig. Wenn die Projektdatei z. B. ausgecheckt wird und in der Quellcodeverwaltungs-Datenbank eine neue Version enthalten ist, tritt ein erneuter Ladevorgang auf. Ein erneuter Ladevorgang kann beispielsweise auch auftreten, wenn die Projektdatei eingecheckt wird und mit den Dateien in der Quellcodeverwaltung zusammengeführt werden muss.

  • Ein Projektelement wird mit dem Befehl Speichern unter gespeichert. Auf diese Weise wird ein neues ProjectItem-Objekt für die Datei erstellt. Das ursprüngliche Objekt wird ungültig.

  • Das Projekt wird aus einem beliebigen Grund neu geladen.

Es gibt keine Eigenschaft, die daraufhin überprüft werden kann, ob ein Verweis auf ein Projekt oder ein Projektelement weiterhin gültig ist. Die relevanten, von einigen Eigenschaften und Methoden eines Objekts zurückgegebenen Fehler deuten darauf hin, dass der Verweis keine Gültigkeit mehr hat. Sie können diese Probleme vermeiden, indem Sie stabile Programmiermethoden verwenden.

Beim Erstellen eines neuen Projekts sollen keine Fehlermeldungen angezeigt werden.

Bei Verwendung der AddFromFile-Methode werden verschiedene Dialogfelder eingeblendet, wenn bei der Projekterstellung Fehler auftreten. Sie können die LaunchWizard-Methode verwenden, um neue Projekte zu erstellen und die Benutzeroberfläche zu unterdrücken. Wenn LaunchWizard zum Erstellen eines neuen Projekts von einem Erweiterbarkeitsprojekt aufgerufen wird, besteht das Standardverhalten darin, dass Fehler in Meldungsfeldern angezeigt werden.

Die LaunchWizard-Methode verwendet beim Ausführen eines neuen Projekt-Assistenten zwei Argumente. Das erste Argument entspricht dem Namen der Assistentendatei (.vsz). Das zweite Argument ist ein Wertarray, das an den Assistenten übergeben wird, wenn er ausgeführt wird. Indem Sie das siebte Arrayelement auf true festlegen, können Sie erzwingen, dass durch die Fehler Ausnahmen ausgelöst werden, die in einer Try...Catch-Struktur abgefangen werden können. Der Assistent für neue Windows-Anwendungen erwartet die folgenden Werte im Array:

Arrayindex

Wert

0

WizardType, eine GUID, die den Typ des Assistenten angibt. Bei einem neuen Projekt-Assistenten lautet die GUID "{0F90E1D0-4999-11D1-B6D1-00A0C90F2744}".

1

ProjectName, eine Zeichenfolge für den Namen des neuen Projekts.

2

Lokales Verzeichnis, eine Zeichenfolge mit dem vollständigen Pfad zu dem Ordner, in dem das neue Projekt erstellt wird.

3

Installationsverzeichnis, eine Zeichenfolge mit dem Ordner, in dem Visual Studio installiert ist.

4

Exklusiv, ein boolescher Wert, der angibt, ob eine bestehende geöffnete Projektmappe geschlossen werden sollte.

5

Projektmappenname, ein Zeichenfolgenname für die Projektmappendatei ohne Pfad oder Dateierweiterung.

6

Silent, ein boolescher Wert, der angibt, ob der Assistent ohne Anzeige von Fehlermeldungen ausgeführt werden soll.

Das folgende Makro verdeutlicht die Verwendung des Silent-Flags beim Aufrufen des Assistenten. Wenn Sie dieses Makro einmal ausführen, würden keine Fehler generiert, sofern Verzeichnis und Projekt nicht bereits vorhanden sind. Wird dieses Makro ein zweites Mal ausgeführt, würde ein Fehler ausgelöst. Da das Silent-Flag auf true festgelegt ist, wird eine Ausnahme durch den Try...Catch-Block abgefangen.

' 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

Was bedeutet HRESULT: 0x80047E2C?

Dieser Fehler kann beim Bearbeiten der CodeModel2-Objekte von Visual Basic-Quelldateien auftreten.

Wenn Sie Code schreiben, der Verweise auf CodeElement2-Objekte enthält, müssen Sie beachten, dass sich der zugrunde liegende Quellcode ändern kann, während der Verweis enthalten ist. Das Codeelement kann gelöscht, umbenannt oder in einen Compilerfehler verwickelt werden. In diesem Fall gibt jeder Aufruf eines CodeElement2-Objekts die Fehlermeldung "Ausnahme von HRESULT: 0x80047E2C" zurück.

Ein Verweis, der auf diese Weise ungültig wird, kann nicht mehr wiederhergestellt werden. Wenn Sie dieses Problem beheben möchten, müssen Sie die Fehler im Quellcode beheben und einen neuen Verweis vom CodeModel2-Objekt aufrufen.

Die folgenden Makros zeigen, wie dieser Fehler auftreten kann. Fügen Sie dem Projekt die LostClass-Klasse hinzu. Aktivieren Sie diese als Klasse oberster Ebene, jedoch nicht in einem Namespace oder einer Klasse. Führen Sie das SetElement-Makro aus, löschen Sie die Klasse, und führen Sie das GetElement-Makro aus. Wenn Sie GetElement ausführen, ist die Klasse nicht mehr vorhanden. Der lostClass-Verweis ist ungültig und gibt einen Fehler zurück.

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

Siehe auch

Konzepte

Einführung in die Projekterweiterbarkeit