Errore del compilatore CS1705

Aggiornamento: novembre 2007

Messaggio di errore

La versione di 'NomeTipo' utilizzato dall'assembly 'NomeAssembly1' è successiva rispetto a quella specificata per l'assembly 'NomeAssembly2' a cui viene fatto riferimento.
Assembly 'AssemblyName1' uses 'TypeName' which has a higher version than referenced assembly 'AssemblyName2'

Il numero di versione del tipo a cui viene fatto riferimento è successivo rispetto al numero di versione in un assembly cui viene fatto riferimento.

Si supponga di disporre, ad esempio, di due assembly, A e B. A fa riferimento a una classe myClass aggiunta all'assembly B nella versione 2.0. Il riferimento all'assembly B indica tuttavia la versione 1.0. In base alle regole di unificazione per l'associazione di riferimenti seguite dal compilatore, un riferimento alla versione 2.0 non può essere soddisfatto dalla versione 1.0.

Esempio

Questo esempio è costituito da quattro moduli di codice:

  • Due DLL identiche tranne che per l'attributo di versione.

  • Una DLL che fa riferimento alle due DLL precedenti.

  • Un client.

Di seguito è riportata la prima delle due DLL identiche.

// 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 {}

Di seguito è riportata la versione 2.0 dell'assembly, specificata dall'attributo 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 {}

Salvare questo esempio in un file denominato CS1705ref.cs e compilarlo utilizzando i seguenti flag: /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(); }
}

Nel seguente codice di esempio viene fatto riferimento alla versione 1.0 dell'assembly CS1705.dll. Tuttavia, l'istruzione Ref.A2().M2() fa riferimento al metodo A2 nella classe di CS1705_c.dll, che restituisce un a2 con alias ad A2::A, e il metodo A2 fa riferimento alla versione 2.0 tramite un'istruzione extern. Le versioni pertanto non corrispondono.

Il seguente codice di esempio genera l'errore 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();
   }
}