Megosztás:


Fordítóhiba CS1705

A "AssemblyName1" szerelvény a "TypeName" nevet használja, amely a hivatkozott "AssemblyName2" szerelvénynél magasabb verzióval rendelkezik.

Olyan típushoz fér hozzá, amelynek verziószáma magasabb, mint a hivatkozott szerelvény verziószáma. Ezt a hibát általában ugyanazon szerelvény két verziójának véletlen használata okozza.

Tegyük fel például, hogy van két assembly: Asmb1 és Asmb2. Az Asmb1 szerelvény az Asmb2 szerelvény 1.0 verziójára hivatkozik. Az Szerelvény Asmb1 egy osztályt MyClass is használ, amelyet hozzáadtak az Asmb2 szerelvényhez a 2.0-s verzióban. A fordító rendelkezik egyesítési szabályokkal a hivatkozások kötéséhez, és egy MyClass hivatkozás a 2.0-s verzióban nem elégedtethető ki az 1.0-s verzió által.

Példák

A következő részletesebb példa négy kódmodulból áll:

  • Két azonos DLL, kivéve egy verzióattribútumot.
  • Egy harmadik DLL, amely az első kettőre hivatkozik.
  • Egy ügyfél, amely csak az azonos DLL-ek 1.0-s verziójára hivatkozik, de hozzáfér egy osztályhoz a 2.0-s verzióból.

Az alábbi kód az első azonos DLL-t hozza létre. A kulcsfájlok létrehozásának módjáról további információt a KeyFile (C# Fordító beállításai) című témakörben talál.

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

Az alábbi kód a szerelvény 2.0-s verzióját határozza meg az AssemblyVersionAttribute attribútum által meghatározott módon.

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

Az alábbi kód az előző kódban definiált két DLL-verzióra hivatkozik. AssemblyA a CS1705a.cs (1.0-s verzió) által létrehozott DLL-re hivatkozik. AssemblyB a CS1705b.cs (2.0-s verzió) által létrehozott DLL-re hivatkozik. Ebben ClassCa esetben két metódus van definiálva. Az első egy Return1Aolyan típusú Class1Aobjektumot ad vissza, amely a DLL 1.0-s verziójának aliasa Class1 . A második, Return1Begy olyan típusú Class1Bobjektumot ad vissza, amely a DLL 2.0-s verziójának aliasa Class1 . A definíció Return1A függőséget hoz létre az 1.0-s verzióhoz; a definíció Return1B függőséget hoz létre a 2.0-s verzióhoz.

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

Az alábbi kód cs1705-ös fordítási hibát generál. A CS1705a.cs által létrehozott DLL-re hivatkozik (1.0-s verzió). Azonban a Main metódusban a kód hozzáfér a ClassC elemhez a CS1705c.cs fájlból. ClassC A CS1705b.cs (2.0-s verzió) által definiált típust használ. Ez a CS1705-ös fordítóhibát okozza, mert a típus CS1705.dll-re vonatkozó verziószáma magasabb, mint a hivatkozott CS1705.dll verziója.

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

A hibát az alábbi módok egyikével oldhatja meg:

  • Frissítse a kódot úgy, hogy az összes fájl ugyanazt a DLL-verziót használja.

  • Adjon hozzá egy hivatkozást a DLL 2.0-s verziójára a CS1705d.cs fájlhoz a következő parancs használatával a fordításhoz.

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

    Bár a program lefordítja ezt a parancsot, még mindig nem fut. A program futtatásának engedélyezéséhez megadhat egy alkalmazáskonfigurációs fájlt, amely tartalmaz egy <dependentAssembly> elemet , amely a DLL 1.0-s verziójának helyének megadásához használ <assemblyIdentity> és <codeBase> gyermekelemeket. A konfigurációs fájlokról további információt az Alkalmazások konfigurálása című témakörben talál.

Lásd még