Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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.csBá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.