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


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

Обновлен: Ноябрь 2007

Сообщение об ошибке

Сборка AssemblyName1 использует тип TypeName, версия которого является более поздней по сравнению с версией сборки AssemblyName2, на которую ссылается первая сборка
Assembly 'AssemblyName1' uses 'TypeName' which has a higher version than referenced assembly 'AssemblyName2'

Создается ссылка на тип, номер версии которого выше, чем у версии в сборке, на которую создается ссылка.

Допустим, у нас есть две сборки, A и B. Сборка A ссылается на класс myClass, добавленный в сборку B в версии 2.0. Однако в ссылке на сборку B указана версия 1.0. Компилятор обладает правилами унификации для связывания ссылок, и ссылка на версию 2.0 не может быть удовлетворена версией 1.0.

Пример

Данный пример кода состоит из четырех модулей.

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

  • Библиотека DLL, которая на них ссылается.

  • Клиент.

Ниже приведена первая из двух идентичных библиотек DLL.

// CS1705_a.cs
// compile with: /target:library /out:c:\\cs1705.dll /keyfile:mykey.snk
[assembly:System.Reflection.AssemblyVersion("1.0")]
public class A 
{
   public void M1() {}
   public class N1 {}
   public void M2() {}
   public class N2 {}
}

public class C1 {}
public class C2 {}

Ниже показана версия 2.0 сборки, как указано в атрибуте AssemblyVersionAttribute.

// CS1705_b.cs
// compile with: /target:library /out:cs1705.dll /keyfile:mykey.snk
using System.Reflection;
[assembly:AssemblyVersion("2.0")]
public class A 
{
   public void M2() {}
   public class N2 {}
   public void M1() {}
   public class N1 {}
}

public class C2 {}
public class C1 {}

Сохраните этот образец кода в файл CS1705ref.cs и скомпилируйте его с использованием следующих отметок. /t:library /r:A2=.\bin2\CS1705a.dll /r:A1=.\bin1\CS1705a.dll

// CS1705_c.cs
// compile with: /target:library /r:A2=c:\\CS1705.dll /r:A1=CS1705.dll
extern alias A1;
extern alias A2;
using a1 = A1::A;
using a2 = A2::A;
using n1 = A1::A.N1;
using n2 = A2::A.N2;
public class Ref 
{
   public static a1 A1() { return new a1(); }
   public static a2 A2() { return new a2(); }
   public static A1::C1 M1() { return new A1::C1(); }
   public static A2::C2 M2() { return new A2::C2(); }
   public static n1 N1() { return new a1.N1(); }
   public static n2 N2() { return new a2.N2(); }
}

Пример ниже содержит ссылку на версию 1.0 сборки CS1705.dll. Однако оператор Ref.A2().M2() ссылается на метод A2 в классе библиотеки CS1705_c.dll, который возвращает значение a2, являющееся псевдонимом A2::A, а сборка A2 ссылается на версию 2.0 через оператор extern, тем самым вызывая несоответствие версий.

Следующий пример приводит к возникновению ошибки CS1705.

// CS1705_d.cs
// compile with: /reference:c:\\CS1705.dll /reference:CS1705_c.dll
// CS1705 expected
class Tester 
{
   static void Main() 
   {
      Ref.A1().M1();
      Ref.A2().M2();
   }
}