Compartilhar via


Erro do Compilador CS1705

O assembly 'AssemblyName1' usa 'TypeName', que tem uma versão mais recente que o assembly 'AssemblyName2' usado como referência

Você está acessando um tipo que tem um número de versão superior ao número de versão de um assembly referenciado. Normalmente, esse erro é causado pelo uso acidental de duas versões do mesmo assembly.

Por exemplo, suponha que você tem dois assemblies, Asmb1 e Asmb2. O assembly Asmb1 faz referência à versão 1.0 do assembly Asmb2. O assembly Asmb1 também usa uma classe MyClass que foi adicionada ao assembly Asmb2 na versão 2.0. O compilador tem regras de unificação para referências de associação e uma referência à MyClass na versão 2.0 não puder ser satisfeita pela versão 1.0.

Exemplos

O exemplo mais detalhado a seguir consiste em quatro módulos de código:

  • Duas DLLs que são idênticas, exceto por um atributo de versão.

  • Uma terceira DLL que referencia as duas primeiras.

  • Um cliente que faz referência somente à versão 1.0 das DLLs idênticas, mas acessa uma classe da versão 2.0.

O código a seguir cria a primeira das DLLs idênticas. Para obter informações sobre como gerar um arquivo de chave, confira KeyFile (opções do compilador C#).

// CS1705a.cs  
  
// Compile by using the following command:
//      csc /target:library /out:C:\\CS1705.dll /keyfile:mykey.snk CS1705a.cs  
  
// The DLL is created in the C:\ directory.  
  
// The AssemblyVersion attribute specifies version 1.0 for this DLL.  
  
[assembly:System.Reflection.AssemblyVersion("1.0")]  
public class Class1
{  
   public void Method1() {}  
}  

O código a seguir define a versão 2.0 do assembly, conforme especificado pelo atributo AssemblyVersionAttribute.

// CS1705b.cs  
  
// Compile by using the following command:
//     csc /target:library /out:CS1705.dll /keyfile:mykey.snk CS1705b.cs  
  
// The DLL is created in the current directory.  
  
// The AssemblyVersion attribute specifies version 2.0 for this DLL.  
  
[assembly:System.Reflection.AssemblyVersion("2.0")]  
public class Class1  
{  
    public void Method1() { }  
}  

O código a seguir faz referência às duas versões de DLL que são definidas no código anterior. AssemblyA refere-se à DLL criada pelo CS1705a.cs (versão 1.0). AssemblyB refere-se à DLL criada pelo CS1705b.cs (versão 2.0). Na ClassC, dois métodos são definidos. O primeiro, Return1A, retorna um objeto do tipo Class1A, que é um alias para a Class1 da versão 1.0 da DLL. O segundo, Return1B, retorna um objeto do tipo Class1B, que é um alias para a Class1 da versão 2.0 da DLL. A definição de Return1A cria uma dependência na versão 1.0. A definição de Return1B cria uma dependência na versão 2.0.

// CS1705c.cs  
  
// Compile by using the following command. AssemblyA refers to the DLL created by  
// CS1705a.cs (version 1.0). AssemblyB refers to the DLL created by CS1705b.cs  
// (version 2.0).  
//    csc /target:library /r:AssemblyA=C:\\CS1705.dll /r:AssemblyB=CS1705.dll CS1705c.cs  
  
extern alias AssemblyA;  
extern alias AssemblyB;  
  
// Class1A is an alias for type Class1 from VS1705a.cs, which is in version 1.0
// of the assembly. Class1B is an alias for type Class1 from CS1705b.cs, which  
// is in version 2.0 of the assembly.  
  
using Class1A = AssemblyA::Class1;  
using Class1B = AssemblyB::Class1;  
  
// Method Return1A in ClassC returns an object of type Class1A, which is  
// Class1 from version 1.0 of the DLL. Method Return1B returns an object  
// of type Class1B, which is Class1 from version 2.0 of the DLL.  
  
public class ClassC  
{  
    // The following line creates a dependency on version 1.0 of CS1705.dll.  
    // This is not the source of the problem when ClassC is accessed from  
    // CS1705d.cs because CS1705d.cs references version 1.0 of the DLL.
    // Therefore, type Class1A and the assembly have the same version.  
    public static Class1A Return1A() { return new Class1A(); }  
  
    // The following line creates a dependency on version 2.0 of CS1705.dll.  
    // This causes compiler error CS1705 when ClassC is accessed from
    // CS1705d.cs, because CS1705d.cs does not reference version 2.0 of the
    // DLL. Class1B is the alias for Class1 in version 2.0, and CS1705d.cs
    // references version 1.0.  
    public static Class1B Return1B() { return new Class1B(); }  
}  

O código a seguir gera o erro do compilador CS1705. Ele referencia a DLL criada pelo CS1705a.cs (versão 1.0). No entanto, no método Main, o código acessa a ClassC do CS1705c.cs. ClassC usa um tipo que é definido no CS1705b.cs (versão 2.0). Isso gera o erro do compilador CS1705 porque o tipo tem um número de versão para a CS1705.dll que é superior ao da versão referenciada da CS1705.dll.

// CS1705d.cs  
  
// Compile by using the following command:  
//     csc /reference:C:\\CS1705.dll /reference:CS1705c.dll CS1705d.cs  
  
// C:\\CS1705.dll is version 1.0 of the assembly.  
  
class Tester
{  
    static void Main()  
    {  
        // Return1A returns a type defined in version 1.0.  
        ClassC.Return1A().Method1();  
        // Return1B returns a type defined in version 2.0.  
        ClassC.Return1B().Method1();  
    }  
}  

É possível resolver o erro de uma das formas a seguir:

  • Atualizar o código para que todos os arquivos usem a mesma versão da DLL.

  • Adicionar uma referência à versão 2.0 da DLL para o CS1705d.cs, usando o seguinte comando para compilar:

    csc /reference:C:\\CS1705.dll /reference:CS1705.dll /reference:CS1705c.dll CS1705d.cs

    Embora o programa seja compilado ao usar esse comando, ele ainda não será executado. Para habilitar o programa para ser executado, você pode fornecer um arquivo de configuração de aplicativo que inclui um elemento <dependentAssembly> que usa os elementos filho <assemblyIdentity> e <codeBase> para especificar o local da versão 1.0 da DLL. Para obter mais informações sobre arquivos de configuração, consulte Configurando aplicativos.

Confira também