Compilerfehler CS1705

Die Assembly „AssemblyName1“ verwendet „TypeName“, was über eine höhere Version verfügt als die referenzierte Assembly „AssemblyName2“.

Sie greifen auf einen Typ zu, der eine höhere Versionsnummer als die Versionsnummer einer referenzierten Assembly hat. Dieser Fehler wird in der Regel durch die versehentliche Verwendung von zwei Versionen derselben Assembly verursacht.

Nehmen wir beispielsweise an, dass Sie über zwei Assemblys, Asmb1 und Asmb2, verfügen. Die Assembly Asmb1 verweist auf Version 1.0 der Assembly Asmb2. Die Assembly Asmb1 verwendet außerdem eine Klasse MyClass, die zur Assembly Asmb2 in Version 2.0 hinzugefügt wurde. Der Compiler besitzt Vereinheitlichungsregeln für Bindungsverweise, und ein Verweis auf MyClass in Version 2.0 kann nicht von Version 1.0 erfüllt werden.

Beispiele

Das folgende ausführlichere Beispiel besteht aus vier Codemodulen:

  • Zwei DLLs, die, mit Ausnahme von einem Versionsattribut, identisch sind.

  • Eine dritte DLL, die auf die ersten beiden verweist.

  • Ein Client, der nur auf Version 1.0 der identischen DLLs, verweist, jedoch auf eine Klasse von Version 2.0 zugreift.

Der folgende Code erstellt die erste der identischen DLLs. Weitere Informationen zum Generieren einer Schlüsseldatei finden Sie unter KeyFile (C#-Compileroptionen).

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

Der folgende Code definiert die Version 2.0 der Assembly, wie durch das Attribut AssemblyVersionAttribute angegeben.

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

Der folgende Code verweist auf die beiden DLL-Versionen, die im obigen Code definiert sind. AssemblyA bezieht sich auf die DLL, die von „CS1705a.cs“ (Version 1.0) erstellt wurde. AssemblyB bezieht sich auf die DLL, die von „CS1705b.cs“ (Version 2.0) erstellt wurde. In ClassC sind zwei Methoden definiert. Die Erste, Return1A, gibt ein Objekt vom Typ Class1A zurück, d.h. ein Alias für Class1 von Version 1.0 der DLL. Die Zweite, Return1B, gibt ein Objekt vom Typ Class1B zurück, d.h. ein Alias für Class1 von Version 2.0 der DLL. Die Definition von Return1A erstellt eine Abhängigkeit auf Version 1.0 und die Definition von Return1B erstellt eine Abhängigkeit auf Version 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(); }  
}  

Der folgende Code generiert den Compilerfehler CS1705. Er bezieht sich auf die DLL, die von „CS1705a.cs“ (Version 1.0) erstellt wurde. In der Main-Methode greift der Code auf ClassC von „CS1705c.cs“ zu. ClassC verwendet einen Typ, der in „CS1705b.cs“ (Version 2.0) definiert ist. Dies erzeugt den Compilerfehler CS1705, da der Typ eine Versionsnummer für „CS1705.dll“ hat, die höher als die referenzierte Version von „CS1705.dll“ ist.

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

Mit einer der folgenden Möglichkeiten können Sie diesen Fehler beheben:

  • Aktualisieren Sie den Code, sodass alle Dateien die gleiche Version der DLL verwenden.

  • Fügen Sie einen Verweis auf Version 2.0 der DLL zu „CS1705d.cs“ hinzu, indem Sie zum Kompilieren folgenden Befehl verwenden:

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

    Obwohl das Programm kompiliert wird, wenn Sie diesen Befehl verwenden, wird es immer noch nicht ausgeführt. Zum Aktivieren der Ausführung des Programms können Sie eine Anwendungskonfigurationsdatei bereitstellen, die ein <dependentAssembly>-Element enthält. Dieses verwendet die untergeordneten Elemente <assemblyIdentity> und <codeBase>, um den Speicherort von Version 1.0 der DLL anzugeben. Weitere Informationen zu Konfigurationsdateien finden Sie unter Konfigurieren von Apps.

Weitere Informationen