Creare istanze di progetto usando project factory
I tipi di progetto in Visual Studio usano una factory di progetto per creare istanze di oggetti di progetto. Una factory di progetto è simile a una class factory standard per gli oggetti COM cocreabili. Tuttavia, gli oggetti progetto non sono cocreabili; possono essere creati solo usando una factory di progetto.
L'IDE di Visual Studio chiama la factory di progetto implementata nel pacchetto VSPackage quando un utente carica un progetto esistente o crea un nuovo progetto in Visual Studio. Il nuovo oggetto progetto fornisce all'IDE informazioni sufficienti per popolare Esplora soluzioni. Il nuovo oggetto progetto fornisce anche le interfacce necessarie per supportare tutte le azioni dell'interfaccia utente pertinenti avviate dall'IDE.
È possibile implementare l'interfaccia IVsProjectFactory in una classe nel progetto. In genere, si trova nel proprio modulo.
I progetti che supportano l'aggregazione da parte di un proprietario devono rendere persistente una chiave di proprietario nel file di progetto. Quando il CreateProject metodo viene chiamato su un progetto con una chiave di proprietario, il progetto di proprietà converte la chiave di proprietario in un GUID della factory del progetto, quindi chiama il CreateProject
metodo in questa factory di progetto per eseguire la creazione effettiva.
Creare un progetto di proprietà
Un proprietario crea un progetto di proprietà in due fasi:
Chiamando il PreCreateForOwner metodo . In questo modo, il progetto di proprietà può creare un oggetto progetto aggregato in base al controllo di
IUnknown
input . Il progetto di proprietà passa di nuovo l'oggetto internoIUnknown
e l'oggetto aggregato al progetto proprietario. In questo modo il progetto di proprietà può archiviare l'oggetto internoIUnknown
.Chiamando il InitializeForOwner metodo . Il progetto di proprietà esegue tutte le istanze quando questo metodo viene chiamato invece di chiamare
IVsProjectFactory::CreateProject
come sarebbe il caso per i progetti che non sono di proprietà. L'enumerazione di inputVSOWNEDPROJECTOBJECT
è in genere il progetto di proprietà aggregato. Il progetto di proprietà può usare questa variabile per determinare se il relativo oggetto di progetto è già stato creato (il cookie non è uguale a NULL) o deve essere creato (cookie uguale a NULL).I tipi di progetto sono identificati da un GUID di progetto univoco, simile al CLSID di un oggetto COM cocreabile. In genere, una factory di progetto gestisce la creazione di istanze di un singolo tipo di progetto, anche se è possibile che una factory del progetto gestisca più di un GUID di tipo di progetto.
I tipi di progetto sono associati a un'estensione di file specifica. Quando un utente tenta di aprire un file di progetto esistente o tenta di creare un nuovo progetto clonando un modello, l'IDE usa l'estensione nel file per determinare il GUID del progetto corrispondente.
Non appena l'IDE determina se deve creare un nuovo progetto o aprire un progetto esistente di un particolare tipo, l'IDE usa le informazioni nel Registro di sistema in [HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Projects] per trovare quale VSPackage implementa la factory di progetto richiesta. L'IDE carica questo VSPackage. SetSite Nel metodo il pacchetto VSPackage deve registrare la factory del progetto con l'IDE chiamando il RegisterProjectType metodo .
Il metodo primario dell'interfaccia
IVsProjectFactory
è CreateProject, che deve gestire due scenari: apertura di un progetto esistente e creazione di un nuovo progetto. La maggior parte dei progetti archivia lo stato del progetto in un file di progetto. In genere, i nuovi progetti vengono creati creando una copia del file modello passato alCreateProject
metodo e quindi aprendo la copia. I progetti esistenti vengono create tramite l'apertura diretta del file di progetto passato alCreateProject
metodo . IlCreateProject
metodo può visualizzare funzionalità aggiuntive dell'interfaccia utente all'utente in base alle esigenze.Un progetto può anche non usare file e, al contrario, archiviarne lo stato in un meccanismo di archiviazione diverso dal file system, ad esempio un database o un server Web. In questo caso, il parametro del nome file passato al
CreateProject
metodo non è in realtà un percorso del file system, ma una stringa univoca, ovvero un URL, per identificare i dati del progetto. Non è necessario copiare i file modello passati aCreateProject
per attivare l'esecuzione della sequenza di costruzione appropriata.