Gerenciar associações de arquivos lado a lado
Se o VSPackage fornece associações de arquivo, você deve decidir como lidar com instalações lado a lado em que uma versão específica do Visual Studio deve ser invocada para abrir um arquivo. Formatos de arquivo incompatíveis agravam o problema.
Os usuários esperam que uma nova versão de um produto seja compatível com versões anteriores, para que os arquivos existentes possam ser carregados em uma nova versão sem perder dados. Idealmente, seu VSPackage pode carregar e salvar os formatos de arquivo de versões anteriores. Se isso não for verdade, você deve oferecer para atualizar o formato de arquivo para a nova versão do seu VSPackage. A desvantagem dessa abordagem é que o arquivo atualizado não pode ser aberto na versão anterior.
Para evitar esse problema, você pode alterar as extensões quando os formatos de arquivo se tornam incompatíveis. Por exemplo, a versão 1 do VSPackage poderia usar a extensão, .mypkg10, e a versão 2 poderia usar a extensão, .mypkg20. Essa diferença identifica o VSPackage que abre um arquivo específico. Se você adicionar VSPackages mais recentes à lista de programas associados a uma extensão antiga, os usuários poderão clicar com o botão direito do mouse no arquivo e optar por abri-lo em um VSPackage mais recente. Nesse ponto, seu VSPackage pode oferecer para atualizar o arquivo para o novo formato ou abrir o arquivo e manter a compatibilidade com versões anteriores do VSPackage.
Observação
Você pode combinar essas abordagens. Por exemplo, você pode oferecer compatibilidade com versões anteriores carregando um arquivo mais antigo e oferecer a atualização do formato de arquivo quando o usuário salvá-lo.
Enfrente o problema
Se você quiser que vários VSPackages lado a lado usem a mesma extensão, você deve escolher a versão do Visual Studio que está associada à extensão. Aqui estão duas alternativas:
Abra o arquivo na versão mais recente do Visual Studio instalado no computador de um usuário.
Nessa abordagem, o instalador é responsável por determinar a versão mais recente do Visual Studio e incluí-la na entrada do Registro escrita para a associação de arquivo. Em um pacote do Windows Installer, você pode incluir ações personalizadas para definir uma propriedade que indica a versão mais recente do Visual Studio.
Observação
Neste contexto, "mais recente" significa "versão mais recente suportada". Essas entradas do instalador não detectarão automaticamente uma versão subsequente do Visual Studio. As entradas em Detectando requisitos do sistema e em comandos que devem ser executados após a instalação são semelhantes às apresentadas aqui e são necessárias para oferecer suporte a versões adicionais do Visual Studio.
As linhas a seguir na tabela CustomAction definem a propriedade DEVENV_EXE_LATEST como uma propriedade definida pelas tabelas AppSearch e RegLocator discutidas em Comandos que devem ser executadas após a instalação. As linhas na tabela InstallExecuteSequence agendam as ações personalizadas no início da sequência de execução. Os valores na coluna Condição fazem a lógica funcionar:
Visual Studio .NET 2002 é a versão mais recente se for a única versão atual.
Visual Studio .NET 2003 é a versão mais recente somente se ele estiver presente e Visual Studio não estiver presente.
Visual Studio é a versão mais recente se for a única versão atual.
O resultado líquido é que DEVENV_EXE_LATEST contém o caminho da versão mais recente do devenv.exe.
Linhas da tabela CustomAction que determinam a versão mais recente do Visual Studio
Ação Tipo Origem Destino CA_SetDevenvLatest_2002 51 DEVENV_EXE_LATEST [DEVENV_EXE_2002] CA_SetDevenvLatest_2003 51 DEVENV_EXE_LATEST [DEVENV_EXE_2003] CA_SetDevenvLatest_2005 51 DEVENV_EXE_LATEST [DEVENV_EXE_2005] Linhas da tabela InstallExecuteSequence que determinam a versão mais recente do Visual Studio
Ação Condição Sequência CA_SetDevenvLatest_2002 DEVENV_EXE_2002 E NÃO (DEVENV_EXE_2003 OU DEVENV_EXE_2005) 410 CA_SetDevenvLatest_2003 DEVENV_EXE_2003 E NÃO DEVENV_EXE_2005 420 CA_SetDevenvLatest_2005 DEVENV_EXE_2005 430 Você pode usar a propriedade DEVENV_EXE_LATEST na tabela Registro do pacote do Windows Installer para gravar o valor padrão da chave ProgIdShellOpenCommand do HKEY_CLASSES_ROOT, [DEVENV_EXE_LATEST] "%1"
Execute um programa iniciador compartilhado que pode fazer a melhor escolha entre as versões disponíveis do VSPackage.
Os desenvolvedores do Visual Studio escolheram essa abordagem para lidar com os requisitos complexos dos vários formatos de soluções e projetos que resultam de muitas versões do Visual Studio. Nessa abordagem, você registra um programa iniciador como o manipulador de extensão. O iniciador examina o arquivo e decide qual versão do Visual Studio e seu VSPackage pode manipular esse arquivo específico. Por exemplo, se um usuário abre um arquivo que foi salvo pela última vez por uma versão específica do VSPackage, o iniciador pode iniciar esse VSPackage na versão correspondente do Visual Studio. Além disso, um usuário pode configurar o iniciador para sempre iniciar a versão mais recente. Um iniciador também pode solicitar que um usuário atualize o formato do arquivo. Se o formato do arquivo incluir um número de versão, o iniciador poderá informar a um usuário se o formato de arquivo for de uma versão posterior a um ou mais VSPackages instalados.
O iniciador deve estar em um componente do Windows Installer que é compartilhado com todas as versões do VSPackage. Esse processo garante que a versão mais recente esteja sempre instalada e não seja removida até que todas as versões do VSPackage sejam desinstaladas. Dessa forma, as associações de arquivo e outras entradas do Registro do componente iniciador são preservadas mesmo se uma versão do VSPackage for desinstalada.
Desinstalação e associações de arquivos
A desinstalação de um VSPackage que grava entradas do Registro para associações de arquivos remove as associações de arquivos. Portanto, a extensão não possui programas associados. Windows Installer não "recupera" as entradas do Registro que foram adicionadas quando o VSPackage foi instalado. Aqui estão algumas maneiras de corrigir as associações de arquivo de um usuário:
Use um componente iniciador compartilhado conforme descrito anteriormente.
Instrua o usuário a executar um reparo da versão do VSPackage que o usuário deseja possuir a associação de arquivo.
Forneça um programa executável separado que reescreva as entradas de registro apropriadas.
Forneça uma página ou caixa de diálogo de opções de configuração que permita aos usuários escolher associações de arquivos e recuperar associações perdidas. Instrua os usuários a executá-lo após a desinstalação.