Solucionando problemas de Visual Basic e Visual translation from VPE for Csharp extensibilidade
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# projeto.
Se seu problema específico não aparecer nesta lista, consulte MSDN Online Support 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 do CodeModel2 Não há suporte para o objeto no Visual Basic projetos. Se você chamar um desses métodos, você receberá um erro "Não implementado".Os métodos sem suporte 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: Usar uma macro para adicionar texto no Visual Basic ou no Editor de código translation from VPE for Csharp, que contém um exemplo de como adicionar código para um arquivo de fonte. The 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 objeto, o TextDocument objeto, o EditPoint objeto, o TextPoint objeto e o VirtualPoint objeto.
Eu não é possível alterar as propriedades dos objetos do CodeModel.
Maioria das propriedades no CodeModel2 são implementadas sistema autônomo campos somente leitura para Visual Basic projetos. Se você tentar conjunto uma propriedade em time de execução, você 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 de código no arquivo de fonte. Você pode fazer isso de duas maneiras:
Manualmente, usando o editor de código.
Programaticamente, usando os recursos de edição de texto do modelo de extensibilidade.Para obter detalhes, consulte Como: Usar uma macro para adicionar texto no Visual Basic ou no Editor de código translation from VPE for Csharp, que contém um exemplo de como adicionar código para um arquivo de fonte. The 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 objeto, o TextDocument objeto, o EditPoint2 objeto, o TextPoint objeto e o VirtualPoint objeto.
Chamadas para um objeto CodeElement tem falhas.
Chamadas para um CodeModel2 objeto falha se o projeto for alterado depois que você criar uma referência para o CodeModel2. Por exemplo, talvez seja necessário um aplicativo de extensibilidade que está sendo executado no ambiente de desenvolvimento.Esse aplicativo pode recuperar 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 à CodeModel2 para que classe falha, porque a classe não existe mais no projeto.
Não há nenhuma propriedade que você pode teste para determinar se uma referência é válida ainda.Você pode evitar esses problemas, empregando métodos de programação robusto.
Desejo edição meu código de macro em um editor de texto.
Pode haver ocasiões em que quando você precisar edição seu arquivo de macro em um editor de texto.Para salvar o arquivo de macro em texto sem formatação, sobre o Arquivo menu, clicar no Exportarcomando .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 sistema autônomo um Visual Basic arquivo de fonte com a extensão .vb.
The Adicionar item existente comando a Arquivo menu lhe permite adicionar um Visual Basic arquivo de fonte para o projeto de macro.
Para obter mais informações, consulte Como: Gerenciar macros.
Eu estou obtendo mensagens sobre itens não disponíveis.
Um objeto pode exibir uma variedade de mensagens de erro se a estrutura do projeto alterações ao 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, a Project referência a ele se torna inválido, assim sistema autônomo todos sistema autônomo objetos contidos no projeto. Se você usar esse Project referência, talvez para adicionar um arquivo ao projeto, o método falhará. Por exemplo, a macro a seguir retorna o "projeto não disponível" quando tentar acessoproj.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 quando tentar acesso 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
controle do código-fonte alterações causam uma recarga do projeto.Nesse caso, os objetos antigos se tornar inválidos.Por exemplo, uma recarga ocorre se o fazer check-out do arquivo de projeto e existe uma nova versão no controle do código-fonte banco de dados.sistema autônomo outro exemplo, uma recarga ocorre quando você fazer check-in do arquivo de projeto e devem ser mesclada com sistema autônomo arquivos no controle de fonte.
Um item de projeto for salvo usando o Salvar sistema autônomocomando .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 é válida ainda.Relevantes erros retornados por algumas propriedades e métodos de um objeto indicam que não é válido.Você pode evitar esses problemas, empregando métodos de programação robusto.
Desejo criar um novo projeto e não quer quaisquer mensagens de erro para aparecer.
Ao usar o AddFromFile método, várias caixas de diálogo aparecem quando ocorrem erros ao criar o projeto. The LaunchWizard método pode ser usado para criar novos projetos e suprime 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.
The 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 para novo aplicativos 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-11 D 1-B6D1-00A0C90F2744}". |
1 |
ProjectName, uma seqüência de caracteres para o nome do projeto novo. |
2 |
Pasta local, uma seqüência de caracteres que contém o caminho completo para a pasta em que o novo projeto será criado. |
3 |
Diretório de instalação, uma seqüência de caracteres que contém a pasta em que Visual Studio é instalado. |
4 |
Exclusivo, um valor booliano que indica se qualquer solução aberta existente deve ser fechada. |
5 |
Solução de nome, um nome de seqüência de caracteres para o arquivo de solução, sem o caminho ou a extensão. |
6 |
Silencioso, um valor booliano que indica se o assistente deve ser executado silenciosamente. |
A macro a seguir mostra como usar o sinalizar 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 não já existia.Se você executou essa macro uma segunda vez, um erro seria gerado.Porque o sinalizar silencioso está definido como true, uma exceção é detectada pela Try... Catch bloco.
' 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 há de HRESULT: 0x80047E2C?
Este erro pode ocorrer quando você manipula o CodeModel2 objetos de Visual Basic arquivos de fonte.
Quando você estiver gravando o código que mantém referências a CodeElement2 objetos, você deve estar ciente de que o código de fonte subjacente pode ser alterada 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 CodeElement2objeto retornar a mensagem de erro "exceção de HRESULT: 0x80047E2C."
Depois que uma referência se tornar inválido dessa forma, não será possível recuperá-la.Para corrigir esse problema, você deve corrigir erros no código-fonte e recuperar uma nova referência da CodeModel2 objeto.
As seguintes macros demonstram como esse erro pode ocorrer.Adicione uma classe chamada LostClass para 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 lostClass é inválido 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