Compilerfehler CS1705

Aktualisiert: November 2007

Fehlermeldung

Die Assembly "Assemblyname1" verwendet "Typname", mit einer höheren Versionsnummer als die Assembly "Assemblname2", auf die verwiesen wird.
Assembly 'AssemblyName1' uses 'TypeName' which has a higher version than referenced assembly 'AssemblyName2'

Sie verweisen auf einen Typ, dessen Versionsnummer höher ist als die in einer Assembly, auf die verwiesen wird.

Angenommen, Sie verfügen über zwei Assemblys, A und B. A verweist auf eine myClass-Klasse, die Assembly B in Version 2.0 hinzugefügt wurde. Der Verweis auf Assembly B gibt jedoch Version 1.0 an. Der Compiler verfügt über Vereinheitlichungsregeln für Bindungsverweise, und ein Verweis auf Version 2.0 kann nicht von Version 1.0 erfüllt werden.

Beispiel

Dieses Beispiel besteht aus vier Codemodulen:

  • Zwei DLLs, die bis auf das Versionsattribut identisch sind.

  • Einer DLL, die auf diese verweist.

  • Einem Client.

Die folgende ist die erste der identischen DLLs.

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

Bei der folgenden Version handelt es sich um Version 2.0 der Assembly. Diese wird mit dem AssemblyVersionAttribute-Attribut angegeben.

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

Speichern Sie dieses Beispiel in einer Datei mit dem Namen CS1705ref.cs, und kompilieren Sie diese mit den folgenden Flags: /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(); }
}

Das folgende Beispiel verweist auf Version 1.0 der CS1705.dll-Assembly. Die Anweisung Ref.A2().M2() verweist jedoch auf die A2-Methode in der Klasse in CS1705_c.dll, die ein a2 zurückgibt, das das Alias A2::A erhält. A2 verweist über eine extern-Anweisung auf Version 2.0 und verursacht so einen Versionskonflikt.

Im folgenden Beispiel wird CS1705 generiert.

// 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();
   }
}