COM INTEROP LADE-BY Side Conjuntos
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";
}
}
}
}
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.