Поделиться через


Ошибка компилятора CS1705

Сборка "AssemblyName1" использует "TypeName" более поздней версии, чем сборка "AssemblyName2", на которую дается ссылка

Осуществляется доступ к типу, номер версии которого выше, чем номер версии сборки, на которую создается ссылка. Обычно эта ошибка связана со случайным использованием двух версий одной и той же сборки.

Например, предположим, что есть две сборки, Asmb1 и Asmb2. Сборка Asmb1 ссылается на версию 1.0 сборки Asmb2. Сборка Asmb1 также использует класс MyClass, который был добавлен в сборку Asmb2 версии 2.0. У компилятора имеются правила унификации для привязки ссылок, и ссылку на MyClass в версии 2.0 невозможно обработать с помощью версии 1.0.

Примеры

В следующем более подробном примере показано четыре модуля кода.

  • Две библиотеки DLL идентичны во всем, кроме атрибута версии.

  • Третья библиотека DLL, которая ссылается на первые две.

  • Клиент, который ссылается только на версию 1.0 двух идентичных библиотек DLL, но обращается к классу из версии 2.0.

Следующий код создает первую из двух идентичных библиотек DLL. Сведения о создании файла ключа см. в разделе KeyFile (параметры компилятора 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() {}  
}  

Следующий код определяет версию 2.0 сборки, как указано в атрибуте 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() { }  
}  

Следующий код ссылается на две версии библиотеки DLL, которые были определены в выше приведенном коде. AssemblyA ссылается на библиотеку DLL, созданную файлом CS1705a.cs (версии 1.0). AssemblyB ссылается на библиотеку DLL, созданную файлом CS1705b.cs (версии 2.0). В ClassC определены два метода. Первый, Return1A, возвращает объект типа Class1A, который является псевдонимом для Class1 из версии 1.0 библиотеки DLL. Второй, Return1B, возвращает объект типа Class1B, который является псевдонимом для Class1 из версии 2.0 библиотеки DLL. Определение Return1A создает зависимость от версии 1.0; определение Return1B создает зависимость от версии 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(); }  
}  

Следующий код создает ошибку компилятора CS1705. Он ссылается на библиотеку DLL, созданную файлом CS1705a.cs (версия 1.0). Однако в методе Main код обращается к ClassC из файла CS1705c.cs. ClassC использует тип, определенный в CS1705b.cs (версия 2.0). Это приводит к ошибке компилятора CS1705, поскольку тип имеет номер версии для CS1705.dll, который выше, чем версия, на которую ссылается 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();  
    }  
}  

Эту ошибку можно устранить одним из следующих способов.

  • Обновить код, чтобы все файлы использовали одну версию библиотеки DLL.

  • Добавить в файл CS1705d.cs ссылку на библиотеку DLL версии 2.0 с помощью следующей команды для компиляции:

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

    Хотя программа будет компилироваться при использовании этой команды, она не будет выполняться. Чтобы включить выполнение программы, можно указать файл конфигурации приложения, который включает в себя элемент зависимойAssembly>, использующий <assemblyIdentity> и <codeBase дочерние элементы,> чтобы указать расположение библиотеки DLL версии 1.0.< Дополнительные сведения о файлах конфигурации см. в разделе Настройка приложений.

См. также