Error del compilador CS1705

Actualización: noviembre 2007

Mensaje de error

El ensamblado 'NombreEnsamblado1' utiliza 'NombreTipo' que tiene una versión superior a la del ensamblado 'NombreEnsamblado2' al que se hace referencia
Assembly 'AssemblyName1' uses 'TypeName' which has a higher version than referenced assembly 'AssemblyName2'

Está haciendo referencia 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 hace referencia.

Por ejemplo, tiene dos ensamblados, A y B. A hace referencia a una clase myClass que se ha agregado al ensamblado B en la versión 2.0. Pero la referencia al ensamblado B especifica la versión 1.0. El compilador tiene reglas de unificación para las referencias de enlace y la versión 1.0 no puede satisfacer una referencia a la versión 2.0.

Ejemplo

Este ejemplo está compuesto de cuatro módulos de código:

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

  • Un archivo DLL que hace referencia a ellos.

  • Un cliente.

El siguiente es el primero de los archivos DLL idénticos.

// CS1705_a.cs
// compile with: /target:library /out:c:\\cs1705.dll /keyfile:mykey.snk
[assembly:System.Reflection.AssemblyVersion("1.0")]
public class A 
{
   public void M1() {}
   public class N1 {}
   public void M2() {}
   public class N2 {}
}

public class C1 {}
public class C2 {}

A continuación aparece la versión 2.0 del ensamblado, de acuerdo con lo especificado por el atributo AssemblyVersionAttribute.

// CS1705_b.cs
// compile with: /target:library /out:cs1705.dll /keyfile:mykey.snk
using System.Reflection;
[assembly:AssemblyVersion("2.0")]
public class A 
{
   public void M2() {}
   public class N2 {}
   public void M1() {}
   public class N1 {}
}

public class C2 {}
public class C1 {}

Guarde este ejemplo en un archivo denominado CS1705ref.cs y compílelo con los indicadores siguientes: /t:library /r:A2=.\bin2\CS1705a.dll /r:A1=.\bin1\CS1705a.dll

// CS1705_c.cs
// compile with: /target:library /r:A2=c:\\CS1705.dll /r:A1=CS1705.dll
extern alias A1;
extern alias A2;
using a1 = A1::A;
using a2 = A2::A;
using n1 = A1::A.N1;
using n2 = A2::A.N2;
public class Ref 
{
   public static a1 A1() { return new a1(); }
   public static a2 A2() { return new a2(); }
   public static A1::C1 M1() { return new A1::C1(); }
   public static A2::C2 M2() { return new A2::C2(); }
   public static n1 N1() { return new a1.N1(); }
   public static n2 N2() { return new a2.N2(); }
}

El ejemplo siguiente hace referencia a la versión 1.0 del ensamblado CS1705.dll. Sin embargo, la instrucción Ref.A2().M2() hace referencia al método A2 en la clase de CS1705_c.dll, que devuelve a2, cuyo alias es A2::A. Por su parte, A2 hace referencia a la versión 2.0 a través de una instrucción extern, lo que provoca una diferencia de versiones.

El código siguiente genera el error CS1705.

// CS1705_d.cs
// compile with: /reference:c:\\CS1705.dll /reference:CS1705_c.dll
// CS1705 expected
class Tester 
{
   static void Main() 
   {
      Ref.A1().M1();
      Ref.A2().M2();
   }
}