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


Ошибка компилятора 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 библиотеки DLL версии 1.0. Во-вторых, Return1Bвозвращает объект типа Class1B, который является псевдонимом из Class1 библиотеки DLL версии 2.0. Определение создает зависимость от версии 1.0. Определение Return1AReturn1B создает зависимость от версии 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.

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

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

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

См. также