Mengapa menggunakan majelis bernama kuat?

107

Apa keuntungan menggunakan majelis bernama kuat?

Hal-hal apa saja yang tidak dapat dilakukan dengan perakitan normal?

pengembang
sumber

Jawaban:

92

Izinkan saya mencantumkan manfaat dari penamaan kuat perakitan Anda terlebih dahulu:

  1. Penamaan yang kuat pada assembly Anda memungkinkan Anda untuk memasukkan assembly Anda ke dalam Cache Majelis Global (GAC). Dengan demikian, ini memungkinkan Anda untuk membagikannya di antara banyak aplikasi.

  2. Penamaan yang kuat menjamin nama unik untuk rakitan itu. Jadi tidak ada orang lain yang dapat menggunakan nama assembly yang sama.

  3. Nama yang kuat melindungi garis keturunan versi majelis. Nama yang kuat dapat memastikan bahwa tidak ada yang dapat menghasilkan versi perakitan Anda berikutnya. Pengguna aplikasi dipastikan bahwa versi rakitan yang mereka muat berasal dari penerbit yang sama yang membuat versi pembuatan aplikasi.

Lebih lanjut tentang penamaan yang kuat dari Microsoft ada di Strong-Named Assemblies ( MSDN ).

Kyle Rosendo
sumber
1
Apakah Anda yakin dengan item 4? Saya pikir mungkin perilaku ini telah berubah baru-baru ini. Saya mencoba membuat pemuatan rakitan yang sangat bernama gagal dengan memodifikasinya, tetapi dimuat tanpa insiden.
Jens
19
Sehubungan dengan # 4 itu tidak benar. Ini tidak dirancang untuk melindungi dari gangguan. Lihat blogs.msdn.com/b/shawnfa/archive/2005/12/13/… untuk lebih lanjut.
Colin Bowern
1
@ RobV8R 90% dependensi kami adalah sumber terbuka, kunci privat ada di repo git publik (sesuai rekomendasi Microsoft) dan tersedia bagi siapa saja yang menginginkannya.
pelacur
1
@ RobV8R Anda tidak dapat menggunakan kata yang dikompromikan di sini, yang akan menyiratkan bahwa kata itu dimaksudkan sebagai rahasia sejak awal. Pedoman Microsoft adalah bahwa kunci pribadi harus disimpan di repositori sumber publik Anda. Kunci pribadi tidak dikompromikan, mereka sengaja diterbitkan. Mengingat bahwa kunci privat diketahui, dan dimaksudkan untuk digunakan oleh orang-orang yang memodifikasi kode sumber terbuka proyek induk (jika tidak, lisensi akan dilanggar dalam banyak kasus) maka orang yang melakukan ini akan menggunakan nomor versi yang berbeda tetapi kunci yang sama, dalam hal ini kasus pengalihan mengikat akan diperlukan.
pelacur
1
@ RobV8R Apa yang awalnya saya dapatkan adalah bahwa banyak orang percaya bahwa penamaan yang kuat menjamin bahwa ketergantungan Anda dikunci ke versi tertentu dari suatu rakitan, dan bukan itu masalahnya, pengalihan pengikatan sederhana dapat mengubah versi yang Anda gunakan asalkan ditandatangani dengan kunci pribadi yang sama. Dan seperti yang telah saya katakan, kunci privat sengaja dipublikasikan untuk sebagian besar dependensi kita.
pelacur
9

Hal-hal apa saja yang tidak dapat dilakukan dengan perakitan normal?

Karena semua diskusi yang dimulai dengan munculnya Nuget menyarankan untuk sepenuhnya menyingkirkan rakitan bernama yang kuat, perusahaan saya mencobanya dan menemukan perubahan perilaku yang signifikan dalam hal pengaturan aplikasi:

Jika Anda menggunakan aplikasi otomatis atau pengaturan aplikasi cakupan pengguna yang disediakan oleh VisualStudio (mewarisi System.Configuration.ApplicationSettingsBase) maka EXE yang kuat akan membuat tepat 1 direktori di dalam% LOCALAPPDATA% yang dinamai misalnya "YourApplication.exe_StrongName_kjsdfzsuzdfiuzgpoisdiufzsdouif" di mana pun EXE berada terletak.

Tetapi tanpa nama yang kuat, lokasi (= jalur) dari EXE akan digunakan untuk membuat nilai hash yang sudah berbeda antara DEBUG dan RELEASE build, membuat banyak direktori di dalam% LOCALAPPDATA% dengan nama seperti "YourApplication.exe_Url_dfg8778d6fs7g6d7f8g69sdf". Ini membuatnya tidak dapat digunakan untuk penerapan ClickOnce di mana direktori penginstalan berubah dengan setiap pembaruan.

kenyal76
sumber
5

Saya ingin menambahkan bahwa tanpa nama yang kuat Anda tidak dapat menggunakan pengalihan yang mengikat dalam file konfigurasi.

Ini tidak akan berhasil:

  <dependentAssembly>
    <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="null" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>

Anda harus memiliki token kunci publik

  <dependentAssembly>
    <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>
tomasat
sumber
9
Pengalihan yang mengikat tidak diperlukan jika Anda tidak memiliki nama yang kuat.
trampster
0

Sekadar contoh: Saya ingin memberikan jawaban dengan lebih menekankan pada keamanan . Dalam kasus kami membuat rakitan dengan kode sumber yang tidak ingin digunakan kembali untuk pihak ketiga tetapi kami ingin dapat diuji, kami dapat dengan kuat menandatangani rakitan dan membuat internal terlihat hanya untuk rakitan tersebut dengan tanda tangan yang sama.

Ricky Youssef
sumber