Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Sestavení AssemblyName1 používá TypeName, který má vyšší verzi než odkazované sestavení AssemblyName2.
Přistupujete k typu, který má vyšší číslo verze než číslo verze v odkazovaném sestavení. Tato chyba je obvykle způsobena náhodným použitím dvou verzí stejného sestavení.
Předpokládejme například, že máte dvě sestavení Asmb1 a Asmb2. Sestavení Asmb1 odkazuje na verzi 1.0 sestavení Asmb2. Assembly Asmb1 také používá třídu MyClass , která byla přidána do sestavení Asmb2 ve verzi 2.0. Kompilátor má pravidla sjednocení pro vazby referencí a odkaz na MyClass ve verzi 2.0 nemůže být splněn verzí 1.0.
Examples
Následující podrobnější příklad se skládá ze čtyř modulů kódu:
- Dvě knihovny DLL, které jsou shodné s výjimkou atributu verze.
- Třetí knihovna DLL, která odkazuje na první dvě knihovny DLL.
- Klient, který odkazuje pouze na verzi 1.0 stejných knihoven DLL, ale přistupuje ke třídě z verze 2.0.
Následující kód vytvoří první z identických knihoven DLL. Informace o tom, jak vygenerovat soubor klíče, naleznete v části KeyFile (možnosti kompilátoru jazyka 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() {}
}
Následující kód definuje verzi 2.0 sestavení, jak je určeno atributem 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() { }
}
Následující kód odkazuje na dvě verze knihovny DLL, které jsou definovány v předchozím kódu.
AssemblyA odkazuje na knihovnu DLL vytvořenou CS1705a.cs (verze 1.0).
AssemblyB odkazuje na knihovnu DLL vytvořenou CS1705b.cs (verze 2.0). Ve ClassC jsou definovány dvě metody. První , Return1Avrátí objekt typu Class1A, což je alias pro Class1 z verze 1.0 knihovny DLL. Druhá, Return1Bvrátí objekt typu Class1B, což je alias pro Class1 z verze 2.0 knihovny DLL. Definice Return1A vytvoří závislost na verzi 1.0; definice Return1B vytvoří závislost na verzi 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(); }
}
Následující kód generuje chybu kompilátoru CS1705. Odkazuje na knihovnu DLL vytvořenou CS1705a.cs (verze 1.0). V metodě Main ale kód přistupuje k ClassC z CS1705c.cs.
ClassC používá typ definovaný v CS1705b.cs (verze 2.0). To způsobí chybu kompilátoru CS1705, protože typ má číslo verze pro CS1705.dll, která je vyšší než odkazovaná verze 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();
}
}
Chybu můžete vyřešit jedním z následujících způsobů:
Aktualizujte kód tak, aby všechny soubory používaly stejnou verzi knihovny DLL.
Přidejte odkaz na verzi 2.0 knihovny DLL pro CS1705d.cs pomocí následujícího příkazu ke kompilaci:
csc /reference:C:\\CS1705.dll /reference:CS1705.dll /reference:CS1705c.dll CS1705d.csI když se program zkompiluje při použití tohoto příkazu, stále se nespustí. Chcete-li povolit spuštění programu, můžete poskytnout konfigurační soubor aplikace, který obsahuje
<dependentAssembly>prvek, jenž využívá<assemblyIdentity>a<codeBase>podřízené prvky k určení umístění verze 1.0 knihovny DLL. Další informace o konfiguračních souborech najdete v tématu Konfigurace aplikací.