Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Zestaw "AssemblyName1" używa elementu "TypeName", który ma wyższą wersję niż przywoływany zestaw "AssemblyName2"
Uzyskujesz dostęp do typu, który ma wyższy numer wersji niż numer wersji w zestawie, do którego się odwołujesz. Zazwyczaj ten błąd jest spowodowany przypadkowym użyciem dwóch wersji tego samego zestawu.
Załóżmy na przykład, że masz dwa zestawy: Asmb1 i Asmb2. Zestaw Asmb1 odwołuje się do wersji 1.0 zestawu Asmb2. Zestaw Asmb1 używa również klasy MyClass
, która została dodana do zestawu Asmb2 w wersji 2.0. Kompilator ma reguły zjednoczenia odwołań do powiązań, a odwołanie do MyClass
w wersji 2.0 nie może być spełnione przez wersję 1.0.
Przykłady
Poniższy bardziej szczegółowy przykład składa się z czterech modułów kodu:
Dwa biblioteki DLL, które są identyczne z wyjątkiem atrybutu wersji.
Trzecia biblioteka DLL, która odwołuje się do dwóch pierwszych.
Klient, który odwołuje się tylko do wersji 1.0 identycznych bibliotek DLL, ale uzyskuje dostęp do klasy z wersji 2.0.
Poniższy kod tworzy pierwszy z identycznych bibliotek DLL. Aby uzyskać informacje o sposobie generowania pliku klucza, zobacz KeyFile (Opcje kompilatora języka C#).
// 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() {}
}
Poniższy kod definiuje wersję 2.0 zestawu, jak określono w atrybucie AssemblyVersionAttribute .
// 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() { }
}
Poniższy kod odwołuje się do dwóch wersji bibliotek DLL zdefiniowanych w poprzednim kodzie. AssemblyA
odwołuje się do biblioteki DLL utworzonej przez CS1705a.cs (wersja 1.0). AssemblyB
odwołuje się do biblioteki DLL utworzonej przez CS1705b.cs (wersja 2.0). W ClassC
pliku zdefiniowano dwie metody. Pierwszy element Return1A
, zwraca obiekt typu Class1A
, który jest aliasem Class1
z wersji 1.0 biblioteki DLL. Drugi element Return1B
zwraca obiekt typu Class1B
, który jest aliasem Class1
z biblioteki DLL w wersji 2.0. Definicja tworzy zależność od wersji 1.0. Definicja Return1A
Return1B
tworzy zależność od wersji 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(); }
}
Poniższy kod generuje błąd kompilatora CS1705. Odwołuje się do biblioteki DLL utworzonej przez CS1705a.cs (wersja 1.0). Jednak w metodzie Main
kod uzyskuje ClassC
dostęp z CS1705c.cs. ClassC
używa typu zdefiniowanego w CS1705b.cs (wersja 2.0). Powoduje to błąd kompilatora CS1705, ponieważ typ ma numer wersji dla CS1705.dll, który jest wyższy niż przywołyna wersja 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();
}
}
Ten błąd można rozwiązać w jeden z następujących sposobów:
Zaktualizuj kod, aby wszystkie pliki używały tej samej wersji biblioteki DLL.
Dodaj odwołanie do wersji 2.0 biblioteki DLL do CS1705d.cs przy użyciu następującego polecenia do skompilowania:
csc /reference:C:\\CS1705.dll /reference:CS1705.dll /reference:CS1705c.dll CS1705d.cs
Mimo że program kompiluje się podczas korzystania z tego polecenia, nadal nie jest uruchamiany. Aby umożliwić uruchamianie programu, możesz podać plik konfiguracji aplikacji zawierający <element zależnyAssembly>, który używa< elementów podrzędnych assemblyIdentity> i <codeBase> w celu określenia lokalizacji wersji 1.0 biblioteki DLL. Aby uzyskać więcej informacji na temat plików konfiguracji, zobacz Konfigurowanie aplikacji.
Zobacz też
Opinia o produkcie .NET
.NET to projekt typu open source. Wybierz link, aby przekazać opinię: