Di .NET BCL ada referensi melingkar antara:
System.dll
danSystem.Xml.dll
System.dll
danSystem.Configuration.dll
System.Xml.dll
danSystem.Configuration.dll
Berikut tangkapan layar dari .NET Reflector yang menunjukkan apa yang saya maksud:
Bagaimana Microsoft menciptakan majelis ini adalah misteri bagi saya. Apakah diperlukan proses kompilasi khusus untuk memungkinkan ini? Saya membayangkan sesuatu yang menarik sedang terjadi di sini.
.net
assemblies
circular-reference
base-class-library
Drew Noakes
sumber
sumber
Jawaban:
Saya hanya bisa tahu bagaimana Proyek Mono melakukan ini. Teorema ini cukup sederhana, meskipun memberikan kekacauan kode.
Mereka pertama-tama mengkompilasi System.Configuration.dll, tanpa bagian yang membutuhkan referensi ke System.Xml.dll. Setelah ini, mereka mengkompilasi System.Xml.dll dengan cara biasa. Sekarang datang keajaiban. Mereka mengkompilasi ulang System.configuration.dll, dengan bagian yang membutuhkan referensi ke System.Xml.dll. Sekarang ada kompilasi yang berhasil dengan referensi melingkar.
Pendeknya:
sumber
RBarryYoung dan Dykam sedang merencanakan sesuatu. Microsoft menggunakan alat internal yang menggunakan ILDASM untuk membongkar rakitan, menghapus semua barang internal / pribadi dan badan metode dan mengkompilasi ulang IL lagi (menggunakan ILASM) menjadi apa yang disebut 'rakitan dehidrasi' atau rakitan metadata. Ini dilakukan setiap kali antarmuka publik perakitan diubah.
Selama pembuatan, rakitan metadata digunakan sebagai ganti yang asli. Dengan cara itu siklus terputus.
sumber
Ini dapat dilakukan dengan cara yang dijelaskan Dykam tetapi Visual Studio menghalangi Anda melakukannya.
Anda harus menggunakan kompilator baris perintah csc.exe secara langsung.
csc / target: perpustakaan ClassA.cs
csc / target: perpustakaan ClassB.cs /reference:ClassA.dll
csc / target: perpustakaan ClassA.cs ClassC.cs /reference:ClassB.dll
sumber
Ini cukup mudah dilakukan di Visual Studio selama Anda tidak menggunakan referensi proyek ... Coba ini:
Jadi begini caramu melakukannya. Tapi serius ... Bukankah Anda PERNAH melakukannya dalam proyek nyata! Jika ya, Santa tidak akan membawakanmu hadiah tahun ini.
sumber
Saya kira itu bisa dilakukan dengan memulai dengan kumpulan asiklik dan menggunakan ILMerge untuk kemudian menggabungkan majelis yang lebih kecil ke dalam kelompok yang terkait secara logis.
sumber
Yah, saya belum pernah melakukannya di Windows, tetapi saya telah melakukannya di banyak lingkungan compile-link-rtl yang berfungsi sebagai nenek moyang praktis untuk itu. Yang Anda lakukan adalah membuat rintisan "target" terlebih dahulu tanpa referensi silang, lalu tautan, lalu tambahkan referensi melingkar, lalu tautkan kembali. Linker umumnya tidak peduli tentang referensi melingkar atau mengikuti rantai referensi, mereka hanya peduli tentang kemampuan menyelesaikan setiap referensi sendiri.
Jadi jika Anda memiliki dua pustaka, A dan B yang perlu mereferensikan satu sama lain, coba sesuatu seperti ini:
Dykam membuat poin yang bagus, Ini dikompilasi, bukan menautkan di .Net, tetapi prinsipnya tetap sama: Buat sumber referensi silang Anda, dengan titik masuk yang diekspor, tetapi dengan semua kecuali satu dari mereka memiliki referensi sendiri ke yang lain yang dipotong di luar. Bangun mereka seperti itu. Kemudian, hapus potongan referensi eksternal dan buat kembali. Ini harus bekerja bahkan tanpa alat khusus, pada kenyataannya, pendekatan ini telah bekerja pada setiap sistem operasi yang pernah saya coba (sekitar 6 di antaranya). Meskipun jelas sesuatu yang mengotomatiskan itu akan sangat membantu.
sumber
Salah satu pendekatan yang mungkin adalah menggunakan kompilasi bersyarat (#if) untuk terlebih dahulu mengkompilasi System.dll yang tidak bergantung pada rakitan lain tersebut, kemudian mengkompilasi rakitan lain, dan terakhir mengkompilasi ulang System.dll untuk memasukkan bagian-bagian yang bergantung pada Xml dan Konfigurasi.
sumber
Secara teknis, mungkin ini tidak dikompilasi sama sekali, dan dirakit dengan tangan. Ini adalah perpustakaan tingkat rendah.
sumber