Erreur du compilateur CS1705
L’assembly 'nom_assembly1' utilise 'nom_type' qui a une version supérieure par rapport à l’assembly 'nom_assembly2' référencé
Vous accédez à un type ayant un numéro de version supérieur au numéro de version d'un assembly référencé. Généralement, cette erreur est due à l'utilisation accidentelle de deux versions du même assembly.
Par exemple, supposons que vous ayez deux assemblys, Asmb1 et Asmb2. L'assembly Asmb1 fait référence à la version 1.0 de l'assembly Asmb2. L'assembly Asmb1 utilise également une classe MyClass
qui a été ajoutée à l'assembly Asmb2 dans la version 2.0. Le compilateur dispose de règles d'unification pour les références de liaison, et une référence à MyClass
dans la version 2.0 ne peut pas être satisfaite par la version 1.0.
Exemples
L'exemple suivant, plus détaillé, comprend quatre modules de code :
Deux DLL qui sont identiques à l’exception d’un attribut de version.
Une troisième DLL qui fait référence aux deux premières.
Un client qui fait référence uniquement à la version 1.0 des DLL identiques, mais accède à une classe de la version 2.0.
Le code suivant crée la première des DLL identiques. Pour plus d’informations sur la génération d’un fichier de clé, consultez KeyFile (Options du compilateur 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() {}
}
Le code suivant défini la version 2.0 de l'assembly, comme spécifié par l'attribut 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() { }
}
Le code suivant fait référence aux deux versions de la DLL qui sont définies dans le code précédent. AssemblyA
fait référence à la DLL créée par CS1705a.cs (version 1.0). AssemblyB
fait référence à la DLL créée par CS1705b.cs (version 2.0). Dans ClassC
, deux méthodes sont définies. La première Return1A
, retourne un objet de type Class1A
, qui est un alias pour Class1
à partir de la version 1.0 de la DLL. La deuxième Return1B
, retourne un objet de type Class1B
, qui est un alias pour Class1
à partir de la version 2.0 de la DLL. La définition de Return1A
crée une dépendance à la version 1.0 ; la définition de Return1B
crée une dépendance à la version 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(); }
}
Le code suivant génère une erreur de compilation CS1705. Elle fait référence à la DLL créée par CS1705a.cs (version 1.0). Toutefois, dans la méthode Main
, le code accède à ClassC
à partir de CS1705c.cs. ClassC
utilise un type défini dans CS1705b.cs (version 2.0). Cela provoque une erreur du compilateur CS1705, car le type possède un numéro de version pour CS1705.dll qui est supérieur à la version référencée de 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();
}
}
Vous pouvez corriger l'erreur en procédant de l'une des manières suivantes :
Mettez à jour le code de telle sorte que tous les fichiers utilisent la même version de la DLL.
Ajoutez une référence à la version 2.0 de la DLL à CS1705d.cs à l'aide de la commande suivante pour compiler :
csc /reference:C:\\CS1705.dll /reference:CS1705.dll /reference:CS1705c.dll CS1705d.cs
Bien que le programme compile lorsque vous utilisez cette commande, il ne fonctionne toujours pas. Pour que le programme s’exécute, vous pouvez fournir un fichier de configuration de l’application qui comprend un <élément dependentAssembly> utilisant les éléments enfants <assemblyIdentity> et <codeBase> pour spécifier l’emplacement de la version 1.0 de la DLL. Pour plus d’informations sur les fichiers de configuration, consultez Configuration d’applications.