Поделиться через


Устранение неполадок расширения среды Visual Basic и Visual C#

Обновлен: Ноябрь 2007

В этом разделе описаны способы решения наиболее часто встречающихся проблем расширяемости, с которыми можно столкнуться при разработке приложения расширяемости для проекта Visual Basic или Visual C#.

Если в данном списке отсутствует необходимый пункт, обратитесь в службу поддержки MSDN по адресу https://support.microsoft.com.

Методы Add и Remove объекта CodeModel не работают.

Методы Add и Remove различных классов объекта CodeModel2 не поддерживаются в проектах Visual Basic. При попытке вызвать один из этих методов возникает ошибка "Не реализовано". К неподдерживаемым методам относятся:

AddAttribute

AddBase

AddClass

AddDelegate

AddEnum

AddFunction

AddImplementedInterface

AddInterface

AddNameSpace

AddParameter

AddProperty

AddStruct

AddVariable

RemoveInterface

RemoveMember

RemoveMethod

RemoveParameter

 

При необходимости добавить к приложению элементы кода с помощью макроса воспользуйтесь функциональными возможностями модели расширяемости по редактированию текста. Дополнительные сведения см. в разделе Практическое руководство. Использование макроса для добавления текста в редакторе кода Visual Basic или Visual C#, где содержится пример добавления кода в исходный файл. В модели общей расширяемости Visual Studio имеется несколько объектов, используемых для чтения и изменения исходного кода. Сюда входят объекты Document, TextDocument, EditPoint, TextPoint и VirtualPoint.

Не удается изменить свойства объектов CodeModel.

Большинство свойств в CodeModel2 реализуются как поля для проектов Visual Basic, доступные только для чтения. При попытке задать свойство во время выполнения возникает ошибка "Не реализовано". К свойствам, доступным только для чтения, относятся следующие свойства:

Access

CanOverride

Comment

DocComment

Getter

InitExpression

IsAbstract

IsConstant

IsShared

MustImplement

Setter

 

Чтобы изменить значение одного из свойств объекта CodeModel2, необходимо изменить определение элемента кода в исходном файле. Для этого существуют два способа:

Сбой при вызове объекта CodeElement.

Если после создания ссылки на CodeModel2 проект изменяется, то вызвать объект CodeModel2 не удастся. Например, приложение расширяемости выполняется в среде разработки. Возможно, данное приложение извлекло экземпляр CodeModel2 для одного из классов, определенных в проекте. Можно удалить этот класс в среде разработки. Последующие вызовы CodeModel2 нельзя произвести, так как данный класс в проекте уже не существует.

Свойство, которое можно проверить, чтобы определить, является ли ссылка все еще действительной, отсутствует. Чтобы избежать таких проблем, следует использовать надежные методы программирования.

Изменение кода макроса в текстовом редакторе.

Возможны случаи, когда возникает необходимость редактирования файла макроса в текстовом редакторе. Чтобы сохранить файл макроса как обычный текст, откройте меню Файл и выберите команду Экспорт. После появления диалогового окна Экспорт файла введите имя файла экспорта, который необходимо создать. Файл будет сохранен как файл кода Visual Basic с расширением .vb.

Команда Добавить существующий элемент в меню Файл позволяет добавить исходный файл Visual Basic к проекту макроса.

Дополнительные сведения см. в разделе Практическое руководство. Управление макросами.

Возникают сообщения о недоступности элементов.

Объект может отображать различные сообщения об ошибках, если структура проекта изменяется, в то время как код содержит ссылку на один из объектов расширяемости. Это может произойти по следующим причинам.

  • В среде разработки проект закрыт. В этом случае ссылка Project на него становится недействительной, так же как и объекты, содержащиеся в проекте. Если использовать ссылку Project, например, для добавления файла к проекту, при выполнении метода произойдет сбой. Например, следующий макрос возвращает "Проект недоступен" при попытке получить доступ к proj.Name:

    ' Macro editor
    Public Sub AccessAClosedProject()
       Dim proj As Project = DTE.Solution.Projects.Item(1)
       DTE.Solution.Close()
       MsgBox(proj.Name)
    End Sub
    
  • Файл удален из проекта. Например, следующий макрос возвращает "Элемент Projectitem недоступен" при попытке получить доступ к 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
    
  • Ссылка удалена из проекта. Например, следующий макрос возвращает "Сервер выдал исключение" при попытке получить доступ к 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
    
  • Изменения в управлении версиями файлов вызывают перезагрузку проекта. В этом случае старые объекты становятся недействительными. Например, перезагрузка произойдет, если извлечь файл проекта, а в базе данных управления версиями файлов существует новая версия. Перезагрузка также может произойти при возврате файла проекта, который необходимо объединить с файлами в управлении версиями файлов.

  • Элемент проекта сохранен с помощью команды Сохранить как. При этом создается новый объект ProjectItem для файла. Исходный объект становится недействительным.

  • Происходит что-либо, вызывающее перезагрузку проекта.

Свойство, которое можно проверить, чтобы определить, является ли ссылка на проект или элемент проекта все еще действительной, отсутствует. Соответствующие ошибки, возвращаемые некоторыми свойствами и методами объекта, являются указателями того, что ссылка недействительна. Чтобы избежать таких проблем, следует использовать надежные методы программирования.

Требуется создать новый проект без отображения сообщений об ошибках.

В случае использования метода AddFromFile возможно появление различных диалоговых окон при возникновении ошибок во время создания проекта. Метод LaunchWizard может быть использован для создания новых проектов и подавления пользовательского интерфейса. При вызове LaunchWizard для создания нового проекта из проекта расширяемости поведением по умолчанию является отображение ошибок в окнах сообщений.

Метод LaunchWizard использует два аргумента во время запуска нового мастера проектов. Первым аргументом является имя файла мастера (с расширением .vsz). Вторым аргументом является массив значений, передаваемый мастеру при выполнении. Если задать седьмой элемент массива как true, то ошибки будут создавать исключения, которые можно перехватывать с помощью структуры Try...Catch. Мастер создания приложений Windows ожидает встретить в массиве следующие значения.

Индекс массива

Значение

0

WizardType — GUID, указывающий тип мастера. Для мастера нового проекта GUID равен "{0F90E1D0-4999-11D1-B6D1-00A0C90F2744}".

1

ProjectName — строка для имени нового проекта.

2

Локальная папка — строка, содержащая полный путь к папке, где будет создан новый проект.

3

Папка установки — строка, содержащая папку, где установлен Visual Studio.

4

Исключающее — логическое значение, показывающее, следует ли закрывать какое-либо существующее открытое решение.

5

Имя решения — имя строки для файла решения, без пути или расширения.

6

Без оповещения — логическое значение, показывающее, должен ли мастер выполняться без оповещения.

Следующий макрос показывает использование флага Silent при вызове мастера. При первом запуске макрос будет выполнен без ошибок, при условии что папка и проект еще не существуют. При втором запуске этого макроса возникнет ошибка. Поскольку флаг Silent имеет значение true, исключение будет перехвачено блоком 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

HRESULT: 0x80047E2C

Данная ошибка возникает при работе с объектами CodeModel2 исходных файлов Visual Basic.

При написании кода, поддерживающего ссылки на объекты CodeElement2, необходимо знать, что базовый исходный код может изменить сохраненную ссылку. Элемент кода может быть удален, переименован или включен в ошибку компилятора. Если это происходит, при любых обращениях к объекту CodeElement2 будет возвращено сообщение об ошибке "Исключение из HRESULT: 0x80047E2C".

Если таким образом ссылка станет недействительной, исправить ее невозможно. Чтобы решить данную проблему, необходимо исправить все ошибки в исходном коде и извлечь новую ссылку из объекта CodeModel2.

В следующих макросах показано, как может произойти такая ошибка. Добавьте в проект класс с именем LostClass. Сделайте его классом верхнего уровня, не внутри пространства имен или класса. Выполните макрос SetElement, удалите класс, а затем выполните макрос GetElement. При выполнении GetElement класс уже не существует, поэтому ссылка lostClass является недействительной и возвращает ошибку.

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

См. также

Основные понятия

Введение в технологию расширения проектов