Partilhar via


Erro do compilador CS1705

O assembly 'AssemblyName1' usa 'TypeName', que possui uma versão superior à da assembly referenciada 'AssemblyName2'.

Está a aceder a um tipo que tem um número de versão superior ao número de versão numa montagem referenciada. Normalmente, este erro é causado pela utilização acidental de duas versões do mesmo conjunto.

Por exemplo, suponha que possui duas assemblies, Asmb1 e Asmb2. Assembly Asmb1 faz referência à versão 1.0 da assembly Asmb2. A assembly Asmb1 também utiliza uma classe MyClass que foi adicionada à assembly Asmb2 na versão 2.0. O compilador tem regras de unificação para referências de ligação, e uma referência a MyClass na versão 2.0 não pode ser satisfeita pela versão 1.0.

Examples

O exemplo seguinte, mais detalhado, consiste em quatro módulos de código:

  • Duas DLLs idênticas exceto por um atributo de versão.
  • Uma terceira DLL que faz referência às duas primeiras.
  • Um cliente que apenas faz referência à versão 1.0 das DLLs idênticas, mas acede a uma classe da versão 2.0.

O código seguinte cria a primeira das DLLs idênticas. Para informações sobre como gerar um ficheiro chave, consulte 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 seguinte define a versão 2.0 do assembly, conforme especificado pelo AssemblyVersionAttribute atributo.

// 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 seguinte faz referência às duas versões DLL definidas no código anterior. AssemblyA refere-se à DLL criada por CS1705a.cs (versão 1.0). AssemblyB refere-se à DLL criada por CS1705b.cs (versão 2.0). Em ClassC, definem-se dois métodos. O primeiro, Return1A, devolve um objeto do tipo Class1A, que é um alias para Class1 da versão 1.0 da DLL. A segunda, Return1B, devolve um objeto do tipo Class1B, que é um alias para 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 seguinte gera o erro do compilador CS1705. Refere-se à DLL criada por CS1705a.cs (versão 1.0). No entanto, no Main método, o código acede ClassC a partir de CS1705c.cs. ClassC utiliza um tipo definido em CS1705b.cs (versão 2.0). Isto causa o erro do compilador CS1705 porque o tipo tem um número de versão para CS1705.dll superior à versão referenciada do 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();
    }
}

Pode resolver o erro de uma das seguintes formas:

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

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

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

    Embora o programa compile quando usa este comando, continua a não ser executado. Para permitir a execução do programa, pode fornecer um ficheiro de configuração da aplicação que inclui um <dependentAssembly> elemento que utiliza <assemblyIdentity> elementos filhos <codeBase> para especificar a localização da versão 1.0 da DLL. Para mais informações sobre ficheiros de configuração, consulte Configurar Aplicações.

Consulte também