Ошибка компилятора 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();
}
}