Apakah mungkin dua DLL mengalami konflik, mencegah solusi untuk dibangun

9

Meskipun saya memiliki kasus khusus, tetapi saya bertanya-tanya tentang situasi umum.

Bisakah dua DLL, ketika ditambahkan sebagai Referensi ke proyek Visual C # saling bertabrakan untuk mencegah solusi dari membangun? Jika ini masalahnya, apa cara yang mungkin untuk mengurangi ini.

Shamim Hafiz
sumber

Jawaban:

13

Ini sangat mungkin.

Jika Anda telah menetapkan namespace yang identik dan mengetik nama pada majelis yang berbeda (atau dalam proyek Anda dan majelis yang ditambahkan), Anda akan mendapatkan konflik dengan kode apa pun yang mencoba menggunakan salah satu dari jenis ini.

Jika Anda memastikan Anda memiliki ruang nama yang unik, seperti halnya referensi Anda, Anda tidak akan mengalami masalah ini.

Kemungkinan lain berkaitan dengan versi dependensi yang berbeda - jika proyek Anda menggunakan (misalnya) pustaka logging di versi 1.2, tetapi rakitan tambahan memiliki ketergantungan pada rakitan yang sama tetapi versi yang berbeda (katakanlah 1.3) dan proyek Anda atau rakitan yang ditambahkan telah dikonfigurasi / dibangun untuk menggunakan versi tertentu, Anda akan mendapatkan konflik dan pembangunan akan gagal.

Kedua masalah ini dapat diatasi dengan menggunakan alias rakitan, seperti dijelaskan di sini .

Oded
sumber
Saya tidak sepenuhnya yakin ini benar. Jika Anda melihat CIL, CLR mengacu pada simbol secara eksplisit dalam rakitan tertentu dengan notasi [rakitan] sebelum setiap simbol. Mungkin saja kompiler C # memberlakukan masalah ini, tapi saya rasa itu bukan batasan platform.
Yam Marcovic
@Yam Marcovic, bagaimana pengompol akan mengetahui namespace mana yang Anda coba gunakan di kelas tertentu? Konflik nama kelas yang sepenuhnya memenuhi syarat pasti akan mencegah pembangunan.
Jeremy
Compiler C # memberi Anda opsi untuk alias alias rakitan, ketika berhadapan dengan rakitan dengan nama yang sama (dan mungkin memiliki simbol yang sama yang ditentukan di dalamnya). Lihat stackoverflow.com/questions/517058/…
Yam Marcovic
@Yam - Benar, bagaimanapun, Anda perlu tahu tentang bendera ini dan menggunakannya. Cukup menambahkan rakitan akan merusak bangunan.
Oded
1
Jelas sekali. Itu sebabnya dia datang ke sini untuk meminta bantuan, kan? Dia ingin tahu tentang bendera ini dan menggunakannya, karena itu akan memberinya solusi yang lebih bersih, tanpa mempengaruhi proyek atau utilitas pihak ke-3.
Yam Marcovic
4

Melihat tidak ada orang lain yang menyebutkan ini, Anda bertanya:

apa cara yang mungkin untuk mengurangi ini

Ada solusi bersih hanya untuk kasus ini, tanpa kendala, dan tanpa penyelesaian yang mengganggu. Anda dapat menetapkan Majelis alises sehingga kompiler akan tahu mana yang harus dirujuk di tempat yang tepat.

Lihat http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx

Yam Marcovic
sumber
3

Ya ini sangat mungkin.
Katakanlah Anda menambahkan referensi ke beberapa DLL yang menggunakan versi lama Lucene.Net dan Anda ingin memasukkan versi terbaru.
Anda dapat memecahkan masalah itu dengan menggunakan alias eksternal: http://msdn.microsoft.com/en-us/library/ms173212.aspx

šljaker
sumber
+1 sepertinya ini jawaban yang tepat, bukan bagaimana dengan "extern" alias.
Jalayn
1

Anda bisa meletakkan sebanyak mungkin versi majelis yang berbeda seperti yang Anda inginkan di Global Assembly Cache asalkan nama tersebut kuat. Ini dapat membantu Anda jika Anda ingin aplikasi yang berbeda menggunakan versi majelis yang berbeda, berdasarkan mesin. Namun menggunakan versi majelis yang berbeda dalam SATU aplikasi akan tetap membuat Anda kesulitan.

Apa alasan Anda membutuhkan kedua versi pada saat yang sama?

Jalayn
sumber
1
Yah saya tidak secara eksplisit menambahkan versi yang berbeda. Pada dasarnya saya punya aplikasi WPF. Sekarang, untuk menambahkan fitur pihak ketiga, saya telah menambahkan beberapa DLL dan ini DLL yang mungkin dalam konflik.
Shamim Hafiz
1
OK, maka Anda mungkin dapat menambahkan DLL terkait pihak ketiga ini ke GAC? Sudah lama sejak saya membaca tentang hal-hal itu tetapi saya curiga ini bisa menyelesaikan masalah Anda.
Jalayn
Apa yang dimaksud dengan GAC di sini?
Shamim Hafiz
1
Global Assembly Cache, lihat msdn.microsoft.com/en-us/library/yf1d93sz%28v=vs.71%29.aspx
Jalayn
0

Tentunya. Anda bisa mendapatkan kesalahan kompilator "Ambiguous Reference", ketika dua objek tidak dapat dibedakan. Biasanya, Anda dapat menentukan path lengkap dalam kode dan itu tidak akan menyebabkan masalah, tetapi jika dll sepenuhnya identik, maka Anda tidak akan dapat membedakan antara dua objek dengan cara apa pun. Sya kami memiliki dua dll:

System.IO yang berisi kelas File

dan

MyProject.IO yang berisi kelas File

Jika Anda memiliki sesuatu seperti ini ...

using System.IO;
using MyProject.IO;

...
private void foo()
{
    File f = new File();
}

... Anda akan memiliki referensi yang ambigu, karena tidak ada cara untuk mengetahui file mana yang Anda bicarakan. Ini akan memperbaikinya:

using System.IO;
using MyProject.IO;

...
private void foo()
{
    MyProject.IO.File f = new MyProject.IO.File();
}

Satu-satunya cara akan sulit untuk memperbaikinya adalah jika jalur "File" identik di kedua majelis, tetapi itu akan membutuhkan situasi yang tidak mungkin di mana dua dll memiliki struktur namespace yang identik. Sebagai contoh, situasi saya di atas tidak akan pernah terjadi, karena tidak ada yang akan menyebutkan proyek di sana "Sistem" (dengan pengecualian dari pengembang aktual kerangka .Net).

Morgan Herlocker
sumber
Sebenarnya itu sering terjadi, jika Anda membangun solusi berdasarkan perpustakaan pihak ketiga yang populer. Misalnya, perpustakaan twitter mungkin tergantung pada versi json lib Anda yang lebih lama
Long