Criar instâncias de projeto usando fábricas de projeto

Os tipos de projeto no Visual Studio usam uma fábrica de projeto para criar instâncias de objetos de projeto. Uma fábrica de projeto é semelhante a uma fábrica de classe padrão para objetos COM cocriáveis. No entanto, objetos de projeto não são cocriáveis; Eles só podem ser criados usando uma fábrica de projetos.

O IDE do Visual Studio chama a fábrica de projeto implementada em seu VSPackage quando um usuário carrega um projeto existente ou cria um novo projeto no Visual Studio. O novo objeto de projeto fornece ao IDE informações suficientes para preencher o Gerenciador de Soluções. O novo objeto de projeto também fornece as interfaces necessárias para oferecer suporte a todas as ações relevantes da interface do usuário iniciadas pelo IDE.

Você pode implementar a IVsProjectFactory interface em uma classe em seu projeto. Normalmente, ele reside em seu próprio módulo.

Os projetos que oferecem suporte a serem agregados por um proprietário devem manter uma chave de proprietário em seu arquivo de projeto. Quando o método é chamado em um projeto com uma chave de proprietário, o projeto de propriedade converte sua chave de proprietário em um GUID de fábrica de projeto e, em seguida, chama o CreateProjectCreateProject método nesta fábrica de projeto para fazer a criação real.

Criar um projeto próprio

Um proprietário cria um projeto próprio em duas fases:

  1. Chamando o PreCreateForOwner método. Isso dá ao projeto próprio a chance de criar um objeto de projeto agregado com base no controle IUnknownde entrada . O projeto de propriedade passa o objeto interno IUnknown e o objeto agregado de volta para o projeto proprietário. Isso dá ao próprio projeto a chance de armazenar o interior IUnknown.

  2. Chamando o InitializeForOwner método. O projeto de propriedade faz toda a sua instanciação quando esse método é chamado em vez de chamar IVsProjectFactory::CreateProject , como seria o caso para projetos que não são de propriedade. A enumeração de entrada é normalmente o projeto de VSOWNEDPROJECTOBJECT propriedade agregada. O projeto de propriedade pode usar essa variável para determinar se seu objeto de projeto já foi criado (cookie não é igual a NULL) ou deve ser criado (cookie é igual a NULL).

    Os tipos de projeto são identificados por um GUID de projeto exclusivo, semelhante ao CLSID de um objeto COM cocriável. Normalmente, uma fábrica de projeto lida com a criação de instâncias de um único tipo de projeto, embora seja possível ter uma fábrica de projeto manipulando mais de um GUID de tipo de projeto.

    Os tipos de projeto estão associados a uma determinada extensão de nome de arquivo. Quando um usuário tenta abrir um arquivo de projeto existente ou tenta criar um novo projeto clonando um modelo, o IDE usa a extensão no arquivo para determinar o GUID do projeto correspondente.

    Assim que o IDE determina se deve criar um novo projeto ou abrir um projeto existente de um tipo específico, o IDE usa as informações no registro do sistema em [HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Projects] para localizar qual VSPackage implementa a fábrica de projeto necessária. O IDE carrega esse VSPackage. No método, o SetSite VSPackage deve registrar sua fábrica de projeto com o IDE chamando o RegisterProjectType método.

    O método principal da IVsProjectFactory interface é CreateProject, que deve lidar com dois cenários: abrir um projeto existente e criar um novo projeto. A maioria dos projetos armazena seu estado de projeto em um arquivo de projeto. Normalmente, novos projetos são criados fazendo uma cópia do arquivo de modelo passado para o CreateProject método e, em seguida, abrindo a cópia. Os projetos existentes são instanciados abrindo diretamente o arquivo de projeto passado para o CreateProject método. O CreateProject método pode exibir recursos adicionais de interface do usuário para o usuário, conforme necessário.

    Um projeto também não pode usar nenhum arquivo e, em vez disso, armazenar seu estado de projeto em um mecanismo de armazenamento diferente do sistema de arquivos, como um banco de dados ou servidor Web. Nesse caso, o parâmetro de nome de arquivo passado para o CreateProject método não é na verdade um caminho do sistema de arquivos, mas uma cadeia de caracteres exclusiva — uma URL — para identificar os dados do projeto. Não é necessário copiar os arquivos de modelo que são passados para CreateProject acionar a sequência de construção apropriada a ser executada.