Pergunta

Preciso implantar várias versões do mesmo projeto C# .NET. A saída do projeto é uma montagem de interopa com ser usada em um aplicativo nativo. O problema que estou tendo é que tenho que implantar várias versões desta montagem lado a lado, mas o que eu faço não parece criar versões diferentes. Em vez disso, as versões se substituem.

Tentei alterar o Guid de montagem, tentei alterar os números da versão de montagem, tentei regenerar a chave de nome forte da montagem, tentei alterar o título e a descrição da montagem. Prefiro não precisar alterar os nomes ou nomes do GUID para tipos individuais na montagem para fins de versão.

Como garanto que essas versões não se substituem e que eu possa vê-las e implantá-las lado a lado?

Desde já, obrigado!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace InteropTest
{
    [Guid("...")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class Test
    {
        public Test()
        {
        }

        public string Version
        {
            get
            {
                return "1.0";
            }
        }
    }
}
Foi útil?

Solução

Prefiro não precisar alterar os nomes ou nomes do GUID para tipos individuais na montagem para fins de versão.

Mas isso exatamente O que você precisa fazer para impedir que os tipos de COM interfiram um no outro. O [GUID] é usado para selecionar a chave do registro em hklm software classes clsid, onde a classe COM está registrada. Duas versões distintas com o mesmo GUID substituirão as chaves um do outro. Também conhecido como Dll Hell. Mudando a interface pública requer Um novo GUID para garantir que os clientes que usam o antigo não morram com impossível diagnosticar o mau comportamento. Um requisito com rock com rock.

Omitir o atributo [GUID] é muito possível, agora você deixa o CLR gerar um para você. Agora, os atributos da montagem começam a desempenhar um papel, o valor do GUID é gerado automaticamente por um algoritmo liso que inclui o nome da montagem e a versão, bem como o conjunto de métodos na interface e seus argumentos. Garantindo assim isso algum Alterações produzem automaticamente um GUID diferente. E, como esperado e necessário, uma [AssemblyVersion] diferente gerará um [GUID] diferente.

Outra abordagem, que é o que eu assumi que você quis dizer com 'lado a lado', é para não Registre a assembléia, mas depende de um manifesto. Deve ser incorporado no programa de clientes, você usa o <clrClass> Elemento para declarar sua classe [Comvisível]. A versão agora se torna um detalhe de implantação. O msdn como fazer é aqui. Lembre -se de que ele deve ser incorporado no cliente Programa, não sua montagem [Comvisível]. Isso tende a ser um problema.

Outras dicas

Experimente a ligação tardia à montagem da interop em seu aplicativo nativo, se puder. Eu também aconselharia contra a geração automática da interface usando autododual e, em vez disso, gerando explicitamente sua própria leitura isto para mais informações. Você pode solucionar o problema abrindo o Regedit e pesquisando o GUID e o Progid para ver quais versões da Assembléia foram registradas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top