Udostępnij za pośrednictwem


Rozwiązywanie problemów z rozszerzalnością Visual Basic i Visual C#

W tym miejscu są techniki niektóre bardziej typowych problemów rozszerzalności można napotkać podczas tworzenia aplikacji rozszerzalności dla zaradzenia Visual Basic lub Visual C# projektu.

Jeśli z określonym problemem nie są wyświetlane na tej liście, zobacz Pomoc techniczna Online sieci MSDN na https://support.microsoft.com Aby uzyskać więcej informacji.

Dodawanie i usuwanie metod w CodeModel nie działają.

Dodawanie i usuwanie metod różnych klas CodeModel2 obiektu nie są obsługiwane w Visual Basic projektów.W przypadku wywołania jednej z tych metod, otrzymasz błąd "Nie zaimplementowane".Nieobsługiwana metody są:

AddAttribute

AddBase

AddClass

AddDelegate

AddEnum

Addfunction()

AddImplementedInterface

AddInterface

AddNameSpace

AddParameter

AddProperty

AddStruct

AddVariable

RemoveInterface

Usuwanie członka

RemoveMethod

RemoveParameter

 

Aby dodać elementy kodu aplikacji za pomocą makra, należy używać funkcji edycji tekstu modelu rozszerzalności.Aby uzyskać szczegółowe informacje, zobacz Jak: Dodawanie tekstu w języku Visual Basic lub Edytor kodu C# za pomocą makra, który zawiera przykład sposobu dodawania kodu do pliku źródłowego.Visual Studio Modelu rozszerzalności Ogólne zawiera kilka obiektów, które są przydatne do odczytywania i modyfikowania kodu źródłowego.Obejmują one Document obiektu, TextDocument obiektu, EditPoint obiektu, TextPoint obiektu oraz VirtualPoint obiektu.

Nie mogę zmienić właściwości obiektów CodeModel.

Większość właściwości w CodeModel2 są implementowane jako pola tylko do odczytu dla Visual Basic projektów.Jeśli spróbujesz ustawić właściwości w czasie wykonywania, otrzymasz błąd "Nie zaimplementowane".Właściwości tylko do odczytu, obejmują:

Dostęp

CanOverride

Komentarz

DocComment

Metoda pobierająca

InitExpression

IsAbstract

IsConstant

IsShared

MustImplement

Setter

 

Aby zmienić wartość CodeModel2 właściwości obiektu, zmiana definicji elementów kodu w pliku źródłowym.Można to zrobić na dwa sposoby:

Występują wywołania obiektu CodeElement.

Wzywa do CodeModel2 obiektu błędów, jeśli projekt zmiany po utworzeniu odwołania do CodeModel2.Na przykład może mieć rozszerzalności aplikacji działającej w środowisku programistycznym.Aplikacja może mieć pobierane CodeModel2 wystąpienia jednej z klas zdefiniowanych w projekcie.Użytkownik może następnie, w środowisku projektowym, usunąć klasy.Kolejne wywołania CodeModel2 dla klasy fail, ponieważ klasa już nie istnieje w projekcie.

Nie ma właściwości można sprawdzić, czy odwołanie jest nadal ważny.Aby uniknąć tych problemów, wykorzystujące niezawodnych metod programowania.

Chcę edytować kod makra w edytorze tekstu.

Może być zmieniana, gdy trzeba edytować plik makro w edytorze tekstu.Aby zapisać plik makr w postaci zwykłego tekstu, na pliku menu, kliknij przycisk wywóz polecenia.Gdy Eksportuj plik pojawi się okno dialogowe, wpisz nazwę pliku eksportu, którego chcesz utworzyć.Plik zostanie zapisany jako Visual Basic źródło pliku z rozszerzeniem .vb.

Dodać istniejący element polecenia na pliku menu umożliwia dodawanie Visual Basic pliku źródłowego do Twojego projektu makro.

Aby uzyskać więcej informacji, zobacz Managing Macros.

Otrzymuję komunikaty o elementach niedostępne.

Obiekt może wyświetlać gamę komunikaty o błędach, jeśli struktury projektu ulegnie zmianie, podczas gdy kod jest gospodarstwo odwołanie do jednego z obiektów rozszerzalności.To może się zdarzyć, gdy:

  • Projekt jest zamknięty w środowisku programistycznym.W tym przypadku Project odwołanie do niego staje się nieważna, podobnie jak wszystkie obiekty zawarte w projekcie.Jeśli używasz, że Project referencyjnych, może dodać pliku do projektu, metoda nie działa.Na przykład następujące makro zwraca wartość "Projekt niedostępna" podczas próby dostępu proj.Name:

    ' Macro editor
    Public Sub AccessAClosedProject()
       Dim proj As Project = DTE.Solution.Projects.Item(1)
       DTE.Solution.Close()
       MsgBox(proj.Name)
    End Sub
    
  • Plik zostanie usunięty z projektu.Na przykład następujące makro zwraca "Projectitem" niedostępny podczas próby uzyskania dostępu do 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
    
  • Odwołanie zostanie usunięty z projektu.Na przykład następujące makro zwraca "Serwer wywołał wyjątek" podczas próby uzyskania dostępu do 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
    
  • Źródło formantu zmieni spowodować reload projektu.W tym przypadku stare obiekty stają się nieprawidłowe.Załaduj ponownie występuje na przykład, jeśli wyewidencjonować plik projektu, a nowa wersja istnieje w bazie danych kontroli źródła.Inny przykład załadowania występuje, gdy sprawdzić w pliku projektu i musi być scalane z plikami w formancie źródła.

  • Element projektu jest zapisane za pomocą Zapisać jako polecenia.Spowoduje to utworzenie nowego ProjectItem obiektu dla pliku.Oryginalny obiekt staje się nieprawidłowy.

  • Dzieje się coś powodujący, że projekt w celu załadowania.

Nie ma właściwości można sprawdzić, czy odwołanie do projektu lub elementu projektu jest nadal ważny.Istotne błędy zwrócone przez niektóre właściwości i metody obiektu wskazują, że nie jest już prawidłowy.Aby uniknąć tych problemów, wykorzystujące niezawodnych metod programowania.

Chcę, aby utworzyć nowy projekt, a nie chcę, komunikaty o błędach i są wyświetlane.

Podczas korzystania z AddFromFile metody, różne okna dialogowe wyświetlane po wystąpieniu błędu podczas tworzenia projektu.LaunchWizard Metoda może służyć do tworzenia nowych projektów i pomija interfejs użytkownika.Podczas wywoływania LaunchWizard do tworzenia nowego projektu z projektu rozszerzalności, zachowanie domyślne jest, że błędy są wyświetlane w polach komunikatu.

LaunchWizard Metoda przyjmuje dwa argumenty, uruchamiając Kreatora nowego projektu.Pierwszym argumentem jest nazwa pliku kreatora (plik .vsz).Drugi argument jest tablica wartości jest przekazywana do kreatora, po jego uruchomieniu.Ustawiając siódmego elementu tablicy, do true, można wymusić na błędy, które generują wyjątki, które mogą zostać schwytane w Try...Catch struktury.Kreator nowej aplikacji Windows oczekuje, że następujące wartości w tablicy:

Indeks tablicy

Wartość

0

WizardType jest identyfikatorem GUID, wskazujące na rodzaj kreatora.Identyfikator GUID jest "{0F90E1D0-4999-11D1-B6D1-00A0C90F2744}" Kreatora nowego projektu.

1

NazwaProjektu, ciąg nazwy nowego projektu.

2

Katalog lokalny ciąg zawierający pełną ścieżkę do folderu, w którym zostanie utworzony nowy projekt.

3

Katalog instalacyjny, ciąg zawierający folder gdzie Visual Studio jest zainstalowany.

4

Wyłączne, wartością logiczną wskazującą, czy wszelkie istniejące rozwiązania otwartych powinno zostać zamknięte.

5

Nazwa rozwiązania nazwy ciąg dla pliku rozwiązania bez ścieżki lub rozszerzenie.

6

Tryb cichy, wartość Boolean wskazującą, czy kreator powinien uruchomić po cichu.

Następujące makro pokazuje, jak użyć flagi podczas wywoływania kreatora.To makro ran once, zostałby uruchomiony bez błędów, pod warunkiem, że katalog i projektu nie już istniał.W przypadku uruchomienia makra, to po raz drugi, błąd będzie uruchamiany.Ponieważ cichy flaga jest ustawiona na true, wyjątek zostanie przechwycony przez Try...Catch block.

' 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

Co to jest wartość HRESULT: 0x80047E2C?

Ten błąd może wystąpić, gdy można manipulować CodeModel2 obiekty z Visual Basic pliki źródłowe.

Podczas pisania kodu, który zachowuje odwołaniami do CodeElement2 obiektów, należy pamiętać, że kodem źródłowym można zmienić, podczas gdy trzymają odniesienia.Element kodu może usunięty, zmieniono jego nazwę lub zaangażowane w błąd kompilatora.Gdy tak się stanie, wszelkie wywołania CodeElement2 obiektu zwraca komunikat o błędzie "wyjątek od HRESULT: 0x80047E2C."

Po odniesienia staje się nieważna w ten sposób, nie można odzyskać.Aby rozwiązać ten problem, należy naprawić błędy w kodzie źródłowym i pobrać nowe odwołanie od CodeModel2 obiektu.

Następujące makra wykazać, w jaki sposób ten błąd może wystąpić.Dodać klasę o nazwie LostClass do swojego projektu.Należy to klasa nadrzędna, nie wewnątrz obszaru nazw lub klasy.Uruchom makro SetElement, usunąć klasy, a następnie uruchom makro GetElement.Po uruchomieniu GetElement, klasa już nie istnieje, i odniesienia lostClass jest nieprawidłowy i zwraca błąd.

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

Zobacz też

Koncepcje

Wprowadzenie do rozszerzalności projektów