Compartilhar via


Solução de problemas de extensibilidade do Visual Basic e do Visual C#

Estas são técnicas para remediar alguns dos problemas de extensibilidade mais comuns que você pode encontrar ao desenvolver um aplicativo de extensibilidade para um Visual Basic ou Visual C# project.

Se o seu problema específico não aparecer nesta lista, consulte o Suporte Online do MSDN em https://support.microsoft.com para obter mais informações.

Adicionar e remover métodos no CodeModel não funcionam.

Os métodos Add e Remove as várias classes da CodeModel2 não há suporte para o objeto na Visual Basic projetos. Se você chamar um desses métodos, você obterá um erro "Não implementado". Os métodos não suportados são:

AddAttribute

AddBase

AddClass

AddDelegate

AddEnum

AddFunction

AddImplementedInterface

AddInterface

AddNameSpace

AddParameter

AddProperty

AddStruct

AddVariable

RemoveInterface

RemoveMember

RemoveMethod

RemoveParameter

 

Para adicionar elementos de código ao seu aplicativo por meio de uma macro, use os recursos de edição de texto do modelo de extensibilidade. Para obter detalhes, consulte Como: utilizar uma Macro para adicionar texto em um Editor de código do C# ou o Visual Basic, que contém um exemplo de como adicionar código a um arquivo de origem. O Visual Studio modelo de extensibilidade geral contém vários objetos que são úteis para ler e modificar o código-fonte. Eles incluem o Document o objeto, o TextDocument objeto, o EditPoint objeto, o TextPoint objeto e o VirtualPoint objeto.

Não posso alterar as propriedades dos objetos CodeModel.

A maioria das propriedades na CodeModel2 são implementados como campos somente leitura para Visual Basic projetos. Se você tentar definir uma propriedade em tempo de execução, obterá um erro "Não implementado". As propriedades somente leitura incluem:

Access

CanOverride

Comment

DocComment

Getter

InitExpression

IsAbstract

IsConstant

IsShared

MustImplement

Setter

 

Para alterar o valor de um CodeModel2 propriedade do objeto, alterar a definição do elemento do código no arquivo de origem. Você pode fazer isso de duas maneiras:

Chamadas para um objeto CodeElement estão falhando.

Chamadas para um CodeModel2 falhas de objeto, se o projeto for alterado depois de criar uma referência para o CodeModel2. Por exemplo, você pode ter um aplicativo de extensibilidade em execução no ambiente de desenvolvimento. Que o aplicativo pode ter recuperado um CodeModel2 instância de uma das classes definidas no projeto. Um usuário pode em seguida, no ambiente de desenvolvimento, exclua a classe. As chamadas subseqüentes para o CodeModel2 para que classe falha, porque a classe não existe mais no projeto.

Não há nenhuma propriedade que você pode testar para determinar se uma referência é ainda válida. Você pode evitar esses problemas, empregando métodos de programação robustos.

Desejo editar o meu código de Macro em um Editor de texto.

Pode haver ocasiões em que você precise editar seu arquivo de macro em um editor de texto. Para salvar seu arquivo de macro em texto sem formatação, diante do arquivo menu, clique no Exportar comando. Quando o Exportar arquivo caixa de diálogo for exibida, digite o nome do arquivo de exportação que você deseja criar. O arquivo será salvo como um Visual Basic o arquivo de origem com a extensão. vb.

O Add Existing Item comando sobre o arquivo menu permite que você adicione um Visual Basic arquivo de origem para o seu projeto de macro.

Para obter mais informações, consulte Managing Macros.

Estou recebendo mensagens sobre itens não está disponíveis.

Um objeto pode exibir uma variedade de mensagens de erro se a estrutura do projeto for alterado enquanto seu código está mantendo uma referência a um dos objetos de extensibilidade. Isso pode acontecer quando:

  • O projeto seja fechado no ambiente de desenvolvimento. Nesse caso, o Project referência a ele se torna inválida, assim como todos os objetos contidos no projeto. Se você usar que Project de referência, talvez para adicionar um arquivo ao projeto, o método falhará. Por exemplo, a macro a seguir retorna o "Projeto indisponível" quando tentar a acesso proj.Name:

    ' Macro editor
    Public Sub AccessAClosedProject()
       Dim proj As Project = DTE.Solution.Projects.Item(1)
       DTE.Solution.Close()
       MsgBox(proj.Name)
    End Sub
    
  • Um arquivo é excluído do projeto. Por exemplo, a macro a seguir retorna a "Projectitem" não está disponível quando tentar acessar 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
    
  • Uma referência é excluída do projeto. Por exemplo, a macro a seguir retorna "O servidor emitiu uma exceção" ao tentar acessar 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
    
  • Alterações de controle de origem causam uma recarga do projeto. Nesse caso, os objetos antigos se tornar inválidos. Por exemplo, uma recarga ocorre se você fizer check-out do arquivo de projeto e uma nova versão existe no banco de dados de controle de origem. Como outro exemplo, uma recarga ocorre quando você verificar no arquivo de projeto e ele deve ser mesclado com os arquivos no controle de origem.

  • Um item de projeto será salvo com o Salvar como comando. Isso cria um novo ProjectItem objeto para o arquivo. O objeto original torna-se inválido.

  • Nada acontece que faz com que o projeto ser recarregado.

Não há nenhuma propriedade que você pode testar para determinar se uma referência a um projeto ou item de projeto ainda é válida. Relevantes erros retornados por algumas propriedades e métodos de um objeto indicam que ele não é mais válido. Você pode evitar esses problemas, empregando métodos de programação robustos.

Desejo criar um novo projeto e eu não quero que as mensagens de erro seja exibida.

Ao usar o AddFromFile várias caixas de diálogo do método, são exibidos quando ocorrerem erros durante a criação do projeto. O LaunchWizard método pode ser usado para criar novos projetos e suprimir a interface do usuário. Ao chamar LaunchWizard para criar um novo projeto a partir de um projeto de extensibilidade, o comportamento padrão é que os erros são exibidos nas caixas de mensagem.

O LaunchWizard método leva dois argumentos ao executar um Assistente de novo projeto. O primeiro argumento é o nome do arquivo de assistente (arquivo vsz). O segundo argumento é uma matriz de valores é passada para o assistente quando ele é executado. Definindo o sétimo elemento da matriz para true, você pode forçar os erros para lançar exceções que podem ser detectadas em um Try...Catch estrutura. O Assistente de novo aplicativo Windows espera que os seguintes valores na matriz:

Índice de matriz

Valor

0

WizardType, um GUID que indica o tipo de assistente. Para um novo Assistente de projeto, o GUID é "{0F90E1D0-4999-11D1-B6D1-00A0C90F2744}".

1

ProjectName, uma seqüência de caracteres para o nome do novo projeto.

2

Diretório local, uma seqüência de caracteres que contém o caminho completo para a pasta onde o novo projeto será criado.

3

Diretório de instalação, uma seqüência de caracteres que contém a pasta onde Visual Studio está instalado.

4

Exclusivo, um valor booleano indicando se qualquer solução aberta existente deve ser fechada.

5

Nome da solução, um nome de seqüência de caracteres para o arquivo de solução, sem o caminho ou a extensão.

6

Silencioso, um valor booleano que indica se o assistente deve ser executado silenciosamente.

A macro a seguir mostra como usar o sinalizador silencioso ao chamar o assistente. Se você executou essa macro uma vez, ele será executado sem erros, fornecendo que o diretório e o projeto já não existir. Se você executou essa macro para uma segunda vez, um erro seria gerado. Como o sinalizador silencioso está definido como true, uma exceção é detectada pelo 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

O que é o HRESULT: 0x80047E2C?

Este erro pode ocorrer ao manipular o CodeModel2 objetos do Visual Basic arquivos de origem.

Quando você está escrevendo código que mantém referências a CodeElement2 objetos, você deve estar ciente de que o código de origem subjacente pode alterar enquanto estiver segurando a referência. O elemento de código pode ser excluído, renomeado ou envolvido em um erro do compilador. Quando isso acontece, todas as chamadas para o CodeElement2 objeto retornar a mensagem de erro "exceção de HRESULT: 0x80047E2C."

Depois que uma referência torna-se inválido, dessa forma, não podem ser recuperado. Para corrigir esse problema, você deve corrigir erros no código-fonte e recuperar uma nova referência da CodeModel2 objeto.

As macros a seguintes demonstram como esse erro pode ocorrer. Adicione uma classe chamada LostClass ao seu projeto. Tornar esta uma classe de nível superior, não dentro de um namespace ou classe. Executar a macro SetElement, exclua a classe e, em seguida, executar a macro GetElement. Quando você executa GetElement, a classe não existe mais e a referência de lostClass é inválida e retorna o erro.

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

Consulte também

Conceitos

Introdução à extensibilidade de projetos