Compilerfehler CS1705Compiler Error CS1705

Die Assembly „AssemblyName1“ verwendet „TypeName“, was über eine höhere Version verfügt als die referenzierte Assembly „AssemblyName2“.Assembly 'AssemblyName1' uses 'TypeName' which has a higher version than referenced assembly 'AssemblyName2'

Sie greifen auf einen Typ zu, der eine höhere Versionsnummer als die Versionsnummer einer referenzierten Assembly hat.You are accessing a type that has a higher version number than the version number in a referenced assembly. Dieser Fehler wird in der Regel durch die versehentliche Verwendung von zwei Versionen derselben Assembly verursacht.Typically, this error is caused by the accidental use of two versions of the same assembly.

Nehmen wir beispielsweise an, dass Sie über zwei Assemblys, Asmb1 und Asmb2, verfügen.For example, suppose that you have two assemblies, Asmb1 and Asmb2. Die Assembly Asmb1 verweist auf Version 1.0 der Assembly Asmb2.Assembly Asmb1 references version 1.0 of assembly Asmb2. Die Assembly Asmb1 verwendet außerdem eine Klasse MyClass, die zur Assembly Asmb2 in Version 2.0 hinzugefügt wurde.Assembly Asmb1 also uses a class MyClass that was added to assembly Asmb2 in version 2.0. 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.The compiler has unification rules for binding references, and a reference to MyClass in version 2.0 cannot be satisfied by version 1.0.

BeispielExample

Das folgende ausführlichere Beispiel besteht aus vier Codemodulen:The following more detailed example consists of four code modules:

  • Zwei DLLs, die, mit Ausnahme von einem Versionsattribut, identisch sind.Two DLLs that are identical except for a version attribute.

  • Eine dritte DLL, die auf die ersten beiden verweist.A third DLL that references the first two.

  • Ein Client, der nur auf Version 1.0 der identischen DLLs, verweist, jedoch auf eine Klasse von Version 2.0 zugreift.A client that references only version 1.0 of the identical DLLs, but accesses a class from version 2.0.

Der folgende Code erstellt die erste der identischen DLLs.The following code creates the first of the identical DLLs. Weitere Informationen über das Generieren einer Schlüsseldatei finden Sie unter /keyfile (C#-Compileroptionen).For information about how to generate a key file, see /keyfile (C# Compiler Options).

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

BeispielExample

Der folgende Code definiert die Version 2.0 der Assembly, wie durch das Attribut AssemblyVersionAttribute angegeben.The following code defines version 2.0 of the assembly, as specified by the AssemblyVersionAttribute attribute.

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

BeispielExample

Der folgende Code verweist auf die beiden DLL-Versionen, die im obigen Code definiert sind.The following code references the two DLL versions that are defined in the preceding code. AssemblyA bezieht sich auf die DLL, die von „CS1705a.cs“ (Version 1.0) erstellt wurde.AssemblyA refers to the DLL created by CS1705a.cs (version 1.0). AssemblyB bezieht sich auf die DLL, die von „CS1705b.cs“ (Version 2.0) erstellt wurde.AssemblyB refers to the DLL created by CS1705b.cs (version 2.0). In ClassC sind zwei Methoden definiert.In ClassC, two methods are defined. Die Erste, Return1A, gibt ein Objekt vom Typ Class1A zurück, d.h. ein Alias für Class1 von Version 1.0 der DLL.The first, Return1A, returns an object of type Class1A, which is an alias for Class1 from version 1.0 of the 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.The second, Return1B, returns an object of type Class1B, which is an alias for Class1 from version 2.0 of the 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.The definition of Return1A creates a dependency on version 1.0; the definition of Return1B creates a dependency on 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(); }  
}  

BeispielExample

Der folgende Code generiert den Compilerfehler CS1705.The following code generates compiler error CS1705. Er bezieht sich auf die DLL, die von „CS1705a.cs“ (Version 1.0) erstellt wurde.It references the DLL created by CS1705a.cs (version 1.0). In der Main-Methode greift der Code auf ClassC von „CS1705c.cs“ zu.However, in the Main method, the code accesses ClassC from CS1705c.cs. ClassC verwendet einen Typ, der in „CS1705b.cs“ (Version 2.0) definiert ist.ClassC uses a type that is defined in CS1705b.cs (version 2.0). 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.This causes compiler error CS1705 because the type has a version number for CS1705.dll that is higher than the referenced version of 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();  
    }  
}  

Mit einer der folgenden Möglichkeiten können Sie diesen Fehler beheben:You can resolve the error in one of the following ways:

  • Aktualisieren Sie den Code, sodass alle Dateien die gleiche Version der DLL verwenden.Update the code so that all files use the same version of the DLL.

  • Fügen Sie einen Verweis auf Version 2.0 der DLL zu „CS1705d.cs“ hinzu, indem Sie zum Kompilieren folgenden Befehl verwenden:Add a reference to version 2.0 of the DLL to CS1705d.cs by using the following command to compile:

    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.Although the program compiles when you use this command, it still does not run. 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 der Version 1.0 der DLL anzugeben.To enable the program to run, you can provide an application configuration file that includes a <dependentAssembly> element that uses <assemblyIdentity> and <codeBase> child elements to specify the location of version 1.0 of the DLL. Weitere Informationen zu Konfigurationsdateien finden Sie unter Konfigurieren von Apps.For more information about configuration files, see Configuring Apps.

Siehe auchSee Also

extern aliasextern alias
::-Operator:: Operator
Erstellen über die Befehlszeile mit csc.exeCommand-line Building With csc.exe