Delen via


Compilerfout CS1705

Assembly 'AssemblyName1' maakt gebruik van 'TypeName' die een hogere versie heeft dan de assembly 'AssemblyName2'.

U opent een type met een hoger versienummer dan het versienummer in een assembly waarnaar wordt verwezen. Deze fout wordt meestal veroorzaakt door het onbedoeld gebruik van twee versies van dezelfde assembly.

Stel dat u twee assembly's hebt, Asmb1 en Asmb2. Assembly Asmb1 verwijst naar versie 1.0 van assembly Asmb2. Assembly Asmb1 maakt ook gebruik van een klasse MyClass die is toegevoegd aan assembly Asmb2 in versie 2.0. De compiler heeft eenwordingsregels voor bindingsverwijzingen en een verwijzing naar MyClass versie 2.0 kan niet worden voldaan door versie 1.0.

Voorbeelden

Het volgende gedetailleerdere voorbeeld bestaat uit vier codemodules:

  • Twee DLL's die identiek zijn, met uitzondering van een versiekenmerk.
  • Een derde DLL die verwijst naar de eerste twee.
  • Een client die alleen verwijst naar versie 1.0 van de identieke DLL's, maar een klasse opent vanaf versie 2.0.

Met de volgende code wordt de eerste van de identieke DLL's gemaakt. Zie KeyFile (C#-compileropties) voor informatie over het genereren van een sleutelbestand.

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

De volgende code definieert versie 2.0 van de assembly, zoals opgegeven door het AssemblyVersionAttribute kenmerk.

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

De volgende code verwijst naar de twee DLL-versies die in de voorgaande code zijn gedefinieerd. AssemblyA verwijst naar het DLL-bestand dat is gemaakt door CS1705a.cs (versie 1.0). AssemblyB verwijst naar de DLL die is gemaakt door CS1705b.cs (versie 2.0). In ClassC worden twee methoden gedefinieerd. De eerste, Return1Aretourneert een object van het type Class1A, een alias voor Class1 versie 1.0 van het DLL-bestand. De tweede, Return1Bretourneert een object van het type Class1B, een alias voor Class1 versie 2.0 van het DLL-bestand. De definitie van Return1A creëert een afhankelijkheid van versie 1.0; de definitie van Return1B creëert een afhankelijkheid van versie 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(); }
}

Met de volgende code wordt compilerfout CS1705 gegenereerd. Het verwijst naar de DLL die is gemaakt door CS1705a.cs (versie 1.0). In de Main methode heeft de code echter toegang tot ClassC CS1705c.cs. ClassC gebruikt een type dat is gedefinieerd in CS1705b.cs (versie 2.0). Dit veroorzaakt compilerfout CS1705 omdat het type een versienummer heeft voor CS1705.dll die hoger is dan de versie waarnaar wordt verwezen van 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();
    }
}

U kunt de fout op een van de volgende manieren oplossen:

  • Werk de code bij zodat alle bestanden dezelfde versie van het DLL-bestand gebruiken.

  • Voeg een verwijzing naar versie 2.0 van het DLL-bestand toe aan CS1705d.cs met behulp van de volgende opdracht om te compileren:

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

    Hoewel het programma wordt gecompileerd wanneer u deze opdracht gebruikt, wordt het nog steeds niet uitgevoerd. Als u wilt dat het programma kan worden uitgevoerd, kunt u een toepassingsconfiguratiebestand opgeven dat een <dependentAssembly> element bevat dat gebruikmaakt <assemblyIdentity> van en <codeBase> onderliggende elementen om de locatie van versie 1.0 van het DLL-bestand op te geven. Zie Apps configureren voor meer informatie over configuratiebestanden.

Zie ook