Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Сборка '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. Дополнительные сведения о файлах конфигурации см. в разделе "Настройка приложений".