Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Rakitan 'AssemblyName1' menggunakan 'TypeName' yang memiliki versi lebih tinggi daripada rakitan yang dirujuk 'AssemblyName2'.
Anda mengakses jenis yang memiliki nomor versi yang lebih tinggi daripada nomor versi dalam rakitan yang dirujuk. Biasanya, kesalahan ini disebabkan oleh penggunaan dua versi perakitan yang sama secara tidak disengaja.
Misalnya, Anda memiliki dua assemblies, yaitu Asmb1 dan Asmb2. Assembly Asmb1 mereferensikan assembly Asmb2 versi 1.0. Assembly Asmb1 juga menggunakan kelas MyClass yang ditambahkan ke assembly Asmb2 di versi 2.0. Kompiler memiliki aturan penyatuan untuk mengikat referensi, dan referensi ke MyClass dalam versi 2.0 tidak dapat dipenuhi oleh versi 1.0.
Examples
Contoh lebih rinci berikut terdiri dari empat modul kode:
- Dua DLL yang identik kecuali untuk atribut versi.
- DLL ketiga yang mereferensikan dua dll pertama.
- Klien yang hanya mereferensikan DLL identik versi 1.0, tetapi mengakses kelas dari versi 2.0.
Kode berikut membuat DLL pertama yang identik. Untuk informasi tentang cara membuat file kunci, lihat KeyFile (C# Compiler Options).
// 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() {}
}
Kode berikut mendefinisikan versi 2.0 dari rakitan, seperti yang ditentukan oleh AssemblyVersionAttribute atribut .
// 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() { }
}
Kode berikut mereferensikan dua versi DLL yang ditentukan dalam kode sebelumnya.
AssemblyA mengacu pada DLL yang dibuat oleh CS1705a.cs (versi 1.0).
AssemblyB mengacu pada DLL yang dibuat oleh CS1705b.cs (versi 2.0). Dalam ClassC, dua metode didefinisikan. Yang pertama, Return1A, mengembalikan objek jenis Class1A, yang merupakan alias untuk Class1 dari dll versi 1.0. Yang kedua, Return1B, mengembalikan objek jenis Class1B, yang merupakan alias untuk Class1 dari dll versi 2.0. Definisi Return1A membuat dependensi pada versi 1.0; definisi Return1B membuat dependensi pada versi 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(); }
}
Kode berikut menghasilkan kesalahan kompilator CS1705. Ini mereferensikan DLL yang dibuat oleh CS1705a.cs (versi 1.0). Namun, dalam metode Main ini, kode mengakses ClassC dari CS1705c.cs.
ClassC menggunakan jenis yang ditentukan dalam CS1705b.cs (versi 2.0). Ini menyebabkan kesalahan kompilator CS1705 karena jenis memiliki nomor versi untuk CS1705.dll yang lebih tinggi dari versi CS1705.dllyang dirujuk.
// 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();
}
}
Anda dapat mengatasi kesalahan dengan salah satu cara berikut:
Perbarui kode sehingga semua file menggunakan versi DLL yang sama.
Tambahkan referensi ke DLL versi 2.0 ke CS1705d.cs dengan menggunakan perintah berikut untuk mengkompilasi:
csc /reference:C:\\CS1705.dll /reference:CS1705.dll /reference:CS1705c.dll CS1705d.csMeskipun program mengkompilasi ketika Anda menggunakan perintah ini, program masih tidak berjalan. Untuk mengaktifkan program agar berjalan, Anda dapat menyediakan file konfigurasi aplikasi yang menyertakan
<dependentAssembly>elemen yang menggunakan<assemblyIdentity>dan<codeBase>elemen turunan untuk menentukan lokasi DLL versi 1.0. Untuk informasi selengkapnya tentang file konfigurasi, lihat Mengonfigurasi Aplikasi.