Pergunta

Eu tenho um aplicativo que precisa trabalhar com duas versões de uma DLL. Imaginei que apenas compilaria o aplicativo uma vez, copiaria o EXE para dois diretórios e copiaria as duas versões das DLLs para cada um desses diretórios. Para sua informação, não estou fazendo nada com o GAC. No entanto, estou obtendo uma Fileloadexception na versão com a DLL com a qual não foi compilada.

No projeto, eu tenho a "versão específica" definida como false para a referência da DLL. Mas talvez essa seja a configuração errada. Como faço para que isso funcione com várias versões?

Foi útil?

Solução 4

Eu decidi contra a mudança do arquivo de configuração, simplesmente porque é outra coisa que eu precisaria fazer. Em relação à alteração do endereço para diferentes versões da DLL, acho que não tenho esse problema, pois estou realmente usando uma interface para chamar meus métodos.

Para dar um pouco mais de detalhes, simplesmente preciso criar uma instância de um tipo em várias DLLs. A partir daí, trato isso como um objeto de interface. Então, aqui está minha solução:

Assembly asm = Assembly.LoadFrom("XXX.YYY.ZZZ.Bin.dll");
Type type = asm.GetType("MyType");
IMyType obj = Activator.CreateInstance(type) as IMyType;

Isso parece funcionar.

Outras dicas

Se a montagem que você estiver referenciando for fortemente assinada, o CLR não o carregará se tiver uma versão diferente daquela com a qual foi compilado. Nesse caso, você pode usar o arquivo de configuração para especificar a versão que gostaria de usar:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="YouAssemblyNameWithoutDotDll"
                              publicKeyToken="your-assembly-token"
                              culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

É claro que isso pressupõe que a nova versão da Assembléia tenha as mesmas assinaturas de método ou você receberá um MissingMethodException em tempo de execução.

Isso ocorre porque toda vez que você recompile a DLL, endereços de funções são alterados. E como você está vinculando seu aplicativo no tempo de compilação com sua DLL, esses endereços devem ser fixados no seu aplicativo. Basicamente, você deve recompilar seu programa sempre com a nova versão da DLL (ou para ser mais precisa, quando mexer com dados de dados) ou usar carregamento dinâmico e getProcaddress.

Certifique -se de que as duas versões da montagem tenham a mesma verificação de Assembly especificadas no seu arquivo AssemblyInfo.cs.

Ex:

[assembly: AssemblyVersion("1.0.0.0")]

Acredito que o padrão gerado para novos projetos antes do VS 2008 é:

[assembly: AssemblyVersion("1.0.0.*")]

que aumentará automaticamente a versão de montagem toda vez que for construída.

Isso é particularmente importante para Assembléias assinadas Como o nome forte de uma montagem inclui sua versão.

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