Compartilhar via


Solucionando problemas de Visual Basic e a extensibilidade 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 CodeModel não funcionam.

Os métodos Add e Remove das várias classes da CodeModel2 objeto não tem suporte no Visual Basic projetos. Se você chamar um desses métodos, você receberá um "não implementado" erro. 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 How to: Usar 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 para um arquivo de origem. O Visual Studio o modelo de extensibilidade geral contém vários objetos que são úteis para ler e modificar o código de origem. Eles incluem o Document o objeto, o TextDocument objeto, o EditPoint objeto, o TextPoint objeto e o VirtualPoint objeto.

Não consigo 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, você obtém um "não implementado" erro. As propriedades somente leitura incluem:

Access

CanOverride

Comment

DocComment

Getter

InitExpression

IsAbstract

IsConstant

IsShared

MustImplement

Setter

 

Para alterar o valor de um CodeModel2 a propriedade do objeto, alterar a definição do elemento de 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, executado 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 a 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 arquivo de origem com a extensão. vb.

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

Para obter mais informações, consulte Como: Gerenciar 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 o seu código está mantendo uma referência a um dos objetos de extensibilidade. Isso pode acontecer quando:

  • Um projeto é 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 referência, talvez para adicionar um arquivo de projeto, o método falhar. Por exemplo, a macro a seguir retorna "Projeto" indisponível ao tentar acessar 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 disponível ao 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 "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 um recarregamento do projeto. Nesse caso, os objetos do antigos se tornar inválidos. Por exemplo, uma recarga ocorre se fazer 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 devem ser mesclada com os arquivos de controle de origem.

  • Um item de projeto é salvo usando o Salvar como comando. Isso cria um novo ProjectItem o 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 apareça.

Ao usar o AddFromFile método, as várias caixas de diálogo aparecem 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 novo Assistente de 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 do Windows espera que os seguintes valores na matriz:

Índice de matriz

Valor

0

WizardType, um GUID indicando 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 de 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. Desde que o sinalizador silencioso é 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

Qual é o HRESULT: 0x80047E2C?

Este erro pode ocorrer quando você manipula 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 renomeado, excluído 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 os 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 execute a macro GetElement. Quando você executa o 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

Introduction to Project Extensibility