Error del compilador CS1705

El ensamblado "AssemblyName1" usa "TypeName" que tiene una versión superior a la del ensamblado "AssemblyName2" al que se hace referencia

Se obtiene acceso a un tipo que tiene un número de versión más alto que el número de versión de un ensamblado al que se hace referencia. Normalmente, este error está provocado por el uso accidental de dos versiones del mismo ensamblado.

Por ejemplo, suponga que tiene dos ensamblados, Asmb1 y Asmb2. El ensamblado Asmb1 hace referencia a la versión 1.0 del ensamblado Asmb2. El ensamblado Asmb1 también usa una clase MyClass que se ha agregado al ensamblado Asmb2 en la versión 2.0. El compilador tiene reglas de unificación para enlazar referencias, y una referencia a MyClass en la versión 2.0 no se puede satisfacer mediante la versión 1.0.

Ejemplos

El ejemplo siguiente más detallado consta de cuatro módulos de código:

  • Dos archivos DLL que son idénticos salvo en un atributo de versión.

  • Un tercer DLL que hace referencia a los dos primeros.

  • Un cliente que hace referencia a la versión 1.0 de los archivos DLL idénticos, pero tiene acceso a una clase de la versión 2.0.

El código siguiente crea el primero de los archivos DLL idénticos. Para obtener información sobre cómo generar un archivo de clave, vea KeyFile (opciones del compilador de 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() {}  
}  

El código siguiente define la versión 2.0 del ensamblado, especificado por el 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() { }  
}  

El código siguiente hace referencia a las dos versiones del archivo DLL que se definen en el código anterior. AssemblyA hace referencia al DLL creado por CS1705a.cs (versión 1.0). AssemblyB hace referencia al DLL creado por CS1705b.cs (versión 2.0). En ClassC, se definen dos métodos. El primero, Return1A, devuelve un objeto de tipo Class1A, que es un alias de Class1 de la versión 1.0 del archivo DLL. El segundo, Return1B, devuelve un objeto de tipo Class1B, que es un alias de Class1 de la versión 2.0 del archivo DLL. La definición de Return1A crea una dependencia en la versión 1.0; la definición de Return1B crea una dependencia en la versión 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(); }  
}  

El código siguiente genera el error del compilador CS1705. Hace referencia al DLL creado por CS1705a.cs (versión 1.0). En cambio, en el método Main, el código tiene acceso a ClassC desde CS1705c.cs. ClassC usa un tipo definido en CS1705b.cs (versión 2.0). Esto provoca el error del compilador CS1705 porque el tipo tiene un número de versión para CS1705.dll que es mayor que la versión a la que se hace referencia de 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();  
    }  
}  

Puede resolver el error de una de las siguientes maneras:

  • Actualice el código para que todos los archivos usen la misma versión del DLL.

  • Agregue una referencia a la versión 2.0 del DLL en CS1705d.cs mediante el siguiente comando para la compilación:

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

    Aunque el programa se compile cuando usa este comando, todavía no se ejecuta. Para permitir que el programa se ejecute, puede proporcionar un archivo de configuración de la aplicación que incluye un elemento <dependentAssembly> que usa los elementos secundarios <assemblyIdentity> y <codeBase> para especificar la ubicación de la versión 1.0 del DLL. Para obtener más información sobre los archivos de configuración, vea Configurar aplicaciones.

Vea también