Condividi tramite


Risoluzione dei problemi relativi all'Extensibility in Visual Basic e Visual C#

Di seguito sono riportate le tecniche risolutive per alcuni dei problemi più comuni di estensibilità riscontrabili durante lo sviluppo di applicazioni estensibilità per un progetto Visual Basic o Visual C#.

Se il problema riscontrato non è presente in questo elenco, visitare il sito del supporto tecnico di MSDN Online all'indirizzo https://support.microsoft.com (informazioni in lingua inglese).

I metodi Add e Remove in CodeModel non funzionano.

I metodi Add e Remove delle diverse classi dell'oggetto CodeModel2 non sono supportati nei progetti Visual Basic. Se si chiama uno di questi metodi, si riceverà un errore di implementazione mancante. I metodi non supportati sono:

AddAttribute

AddBase

AddClass

AddDelegate

AddEnum

AddFunction

AddImplementedInterface

AddInterface

AddNameSpace

AddParameter

AddProperty

AddStruct

AddVariable

RemoveInterface

RemoveMember

RemoveMethod

RemoveParameter

 

Per aggiungere elementi di codice all'applicazione tramite una macro, utilizzare le funzionalità di modifica del testo del modello estensibilità. Per informazioni dettagliate, vedere Procedura: utilizzare una macro per l'aggiunta di testo in un editor di codice Visual Basic o C#, contenente un esempio di aggiunta di codice a un file di origine. Nel modello estensibilità generale di Visual Studio sono contenuti diversi oggetti utili per la lettura e la modifica del codice sorgente, inclusi gli oggetti Document, TextDocument, EditPoint, TextPoint e VirtualPoint.

Impossibile modificare le proprietà degli oggetti CodeModel.

La maggior parte delle proprietà del modello CodeModel2 viene implementata come campi in sola lettura per i progetti Visual Basic. Se si tenta di impostare una proprietà in fase di esecuzione, si riceverà un errore di implementazione mancante. Nelle proprietà di sola lettura sono incluse:

Accesso

CanOverride

Commento

DocComment

Getter

InitExpression

IsAbstract

IsConstant

IsShared

MustImplement

Setter

 

Per modificare il valore della proprietà di un oggetto CodeModel2, modificare la definizione dell'elemento di codice nel file di origine. Tale operazione può essere eseguita in due modi diversi:

Chiamate a un oggetto CodeElement non riuscite

Se vengono apportate modifiche a un progetto dopo la creazione di un riferimento all'oggetto CodeModel2, le chiamate a un oggetto CodeModel2 avranno esito negativo. Si consideri, ad esempio, un'applicazione estensibilità in esecuzione nell'ambiente di sviluppo e si supponga che nell'applicazione sia stata recuperata un'istanza CodeModel2 per una delle classi definite nel progetto. A questo punto un utente potrebbe eliminare la classe nell'ambiente di sviluppo. Le chiamate successive a CodeModel2 per quella classe avranno esito negativo perché la classe non è più presente nel progetto.

Non esiste una proprietà da verificare per determinare se un riferimento è ancora valido. Per evitare questi problemi, si consiglia di impiegare metodi di programmazione robusti.

Modifica del codice delle macro in un editor di testo.

In alcune situazioni può essere necessario modificare il file delle macro in un editor di testo. Per salvare il file delle macro in formato solo testo, scegliere Esporta dal menu File. Quando verrà visualizzata la finestra di dialogo Esporta file, immettere il nome del file di esportazione che si desidera creare. Il file verrà salvato come un file di origine di Visual Basic con l'estensione vb.

Il comando Aggiungi elemento esistente del menu File consente di aggiungere un file di origine di Visual Basic al progetto macro.

Per ulteriori informazioni, vedere Procedura: gestire macro.

Ricezione di messaggi relativi a elementi non disponibili.

Se si apportano modifiche alla struttura del progetto quando nel codice è presente un riferimento a uno degli oggetti estensibilità, è possibile che per un oggetto vengano visualizzati diversi messaggi di errore. Tale condizione può verificarsi nei seguenti casi:

  • Un progetto viene chiuso nell'ambiente di sviluppo. In questo caso, il riferimento Project ad esso non è più valido e lo stesso vale per tutti gli oggetti contenuti nel progetto. Se si utilizza il riferimento Project, ad esempio per aggiungere un file al progetto, il metodo avrà esito negativo. Nella macro riportata di seguito come esempio viene restituito il messaggio "Progetto non disponibile" quando si tenta di accedere a proj.Name:

    ' Macro editor
    Public Sub AccessAClosedProject()
       Dim proj As Project = DTE.Solution.Projects.Item(1)
       DTE.Solution.Close()
       MsgBox(proj.Name)
    End Sub
    
  • Un file è stato eliminato dal progetto. Nella macro riportata di seguito come esempio viene restituito il messaggio "Elemento del progetto non disponibile" quando si tenta di accedere a 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
    
  • Un riferimento è stato eliminato dal progetto. Nella macro riportata di seguito come esempio viene restituito il messaggio "Il server ha generato un'eccezione" quando si tenta di accedere a 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
    
  • Le modifiche al controllo del codice sorgente fanno sì che il progetto venga ricaricato. In questo caso, i precedenti oggetti non saranno più validi. Se ad esempio si estrae il file di progetto e nel database del controllo del codice sorgente esiste una nuova versione, il progetto verrà ricaricato. Il progetto viene ricaricato anche quando si archivia il file di progetto ed è necessario unirlo ai file nel controllo del codice sorgente.

  • Un elemento del progetto viene salvato utilizzando il comando Salva con nome. In questo modo viene creato un nuovo oggetto ProjectItem per il file. L'oggetto originale non risulta più valido.

  • Si esegue un'operazione che provoca il ricaricamento dell'oggetto.

Non esiste una proprietà da verificare per determinare se un riferimento a un progetto o a un elemento del progetto è ancora valido. Gli errori restituiti da alcuni metodi e proprietà di un oggetto indicheranno che esso non è più valido. Per evitare questi problemi, si consiglia di impiegare metodi di programmazione robusti.

Creazione di un nuovo progetto evitando la visualizzazione di finestre di messaggi di errore.

Se si utilizza il metodo AddFromFile e si verificano errori durante la creazione del progetto, verranno visualizzate diverse finestre di dialogo. È possibile utilizzare il metodo LaunchWizard per la creazione di nuovi progetti e l'eliminazione dell'interfaccia utente. Quando si chiama LaunchWizard per creare un nuovo progetto da un progetto di estensibilità, il comportamento predefinito comporta la visualizzazione di finestre di messaggi di errore.

Nel metodo LaunchWizard vengono utilizzati due argomenti quando si esegue la Creazione guidata nuovo progetto. Il primo argomento è il nome del file della procedura guidata (file VSZ). Il secondo argomento è una matrice di valori passata alla procedura guidata durante l'esecuzione. Impostando il settimo elemento della matrice su true, è possibile imporre gli errori in modo che generino eccezioni che saranno rilevate in una struttura Try...Catch. Nella procedura guidata per la creazione di nuove applicazioni Windows sono utilizzati i seguenti valori nella matrice:

Indice della matrice

Valore

0

WizardType, GUID che indica il tipo di procedura guidata. Per la Creazione guidata nuovo progetto, il GUID sarà "{0F90E1D0-4999-11D1-B6D1-00A0C90F2744}".

1

ProjectName, stringa che rappresenta il nome del nuovo progetto.

2

Local directory, stringa contenente il percorso completo della cartella nella quale verrà creato il nuovo progetto.

3

Installation directory, stringa contenente la cartella in cui è installato Visual Studio.

4

Exclusive, valore booleano che indica se una soluzione aperta esistente deve essere chiusa.

5

Solution name, nome stringa relativo al file di soluzione, privo di percorso o estensione.

6

Silent, valore booleano che indica se la procedura guidata deve essere eseguita in modo invisibile all'utente.

Nella macro riportata di seguito viene illustrato come utilizzare il flag Silent quando si chiama la procedura guidata. Se si esegue questa macro una volta sola, verrà eseguita senza errori, purché la directory e il progetto non esistano già. Se si esegue questa macro una seconda volta, verrà generato un errore. Poiché il flag Silent è impostato su true, verrà rilevata un'eccezione dal blocco 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

Definizione di HRESULT: 0x80047E2C?

Può verificarsi questo errore quando si modificano gli oggetti CodeModel2 nei file di origine di Visual Basic.

Quando si scrive codice che conserva riferimenti a oggetti CodeElement2, è necessario ricordare che il codice sorgente sottostante può cambiare mentre si conserva il riferimento. L'elemento di codice può essere eliminato, rinominato oppure essere compreso in un errore di compilazione. Quando si verifica uno di questi casi, qualsiasi chiamata all'oggetto CodeElement2 restituirà il messaggio di errore "Eccezione da HRESULT: 0x80047E2C".

Quando un riferimento perde validità in questo modo, non può più essere recuperato. Per risolvere questo problema, è necessario correggere tutti gli errori nel codice sorgente e recuperare un nuovo riferimento dall'oggetto CodeModel2.

Nelle macro di seguito riportate viene illustrato in che modo questo errore può verificarsi. Aggiungere una classe denominata LostClass al progetto. Renderla una classe di primo livello, al di fuori di uno spazio dei nomi o di una classe. Eseguire la macro SetElement, eliminare la classe, quindi eseguire la macro GetElement. Quando si esegue GetElement, la classe non esisterà più e il riferimento a lostClass non sarà valido, pertanto verrà restituito l'errore.

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

Vedere anche

Concetti

Introduzione all'estensibilità dei progetti