Tại sao sử dụng các tập hợp được đặt tên mạnh?


107

Lợi thế của việc sử dụng các cụm được đặt tên mạnh là gì?

Những điều không thể làm được với một lắp ráp bình thường là gì?

Câu trả lời:


92

Trước tiên, hãy để tôi liệt kê những lợi ích của việc đặt tên mạnh cho assembly của bạn:

  1. Đặt tên mạnh cho assembly của bạn cho phép bạn đưa assembly của mình vào Global Assembly Cache (GAC). Vì vậy, nó cho phép bạn chia sẻ nó giữa nhiều ứng dụng.

  2. Đặt tên mạnh đảm bảo một tên duy nhất cho hội đồng đó. Vì vậy, không ai khác có thể sử dụng cùng một tên lắp ráp.

  3. Tên mạnh bảo vệ dòng phiên bản của một hội. Một cái tên mạnh có thể đảm bảo rằng không ai có thể tạo ra phiên bản tiếp theo của hội đồng của bạn. Người dùng ứng dụng được đảm bảo rằng phiên bản lắp ráp mà họ đang tải đến từ cùng một nhà xuất bản đã tạo ra phiên bản mà ứng dụng được xây dựng.

Thông tin thêm về cách đặt tên mạnh mẽ từ Microsoft là trong Tập hợp được đặt tên mạnh ( MSDN ).


1
Bạn có chắc ở mục 4 không? Tôi nghĩ có lẽ hành vi này đã thay đổi gần đây. Tôi đã cố gắng tải một lắp ráp có tên mạnh không thành công bằng cách sửa đổi nó, nhưng nó đã tải mà không xảy ra sự cố.
Jens

19
Liên quan đến # 4, điều đó là không chính xác. Nó không được thiết kế để bảo vệ chống giả mạo. Xem blog.msdn.com/b/shawnfa/archive/2005/12/13/… để biết thêm.
Colin Bowern

1
@ RobV8R 90% phụ thuộc của chúng tôi là nguồn mở, các khóa riêng tư nằm trong kho lưu trữ git công khai (theo khuyến nghị của Microsoft) và có sẵn cho bất kỳ ai muốn chúng.
trampster

1
@ RobV8R Bạn không thể sử dụng từ xâm nhập ở đây, điều đó có nghĩa là ngay từ đầu nó đã được dự định là bí mật. Nguyên tắc của Microsoft là khóa riêng tư phải được giữ trong kho lưu trữ nguồn công khai của bạn. Các khóa riêng tư không bị xâm phạm, chúng được xuất bản có chủ đích. Giả sử rằng các khóa riêng tư đã được biết đến và nhằm mục đích sử dụng bởi những người sửa đổi mã nguồn mở của các dự án mẹ (nếu không giấy phép sẽ bị vi phạm trong nhiều trường hợp) thì những người làm điều này sẽ sử dụng một số phiên bản khác nhưng cùng một khóa, trong trường hợp này trường hợp chuyển hướng ràng buộc sẽ được yêu cầu.
trampster

1
@ RobV8R Những gì tôi ban đầu nhận được là nhiều người tin rằng việc đặt tên mạnh mẽ đảm bảo rằng sự phụ thuộc của bạn bị khóa với một phiên bản cụ thể của một assembly và điều đó đơn giản là không đúng, một chuyển hướng ràng buộc đơn giản có thể thay đổi phiên bản bạn sử dụng miễn là nó đã được ký bằng cùng một khóa riêng. Và như tôi đã nói, các khóa riêng được cố ý xuất bản cho hầu hết các phụ thuộc của chúng tôi.
trampster

9

Những điều không thể làm được với một lắp ráp bình thường là gì?

Vì tất cả các cuộc thảo luận bắt đầu với sự nổi lên của Nuget đề xuất loại bỏ hoàn toàn các tổ hợp có tên mạnh nên công ty của tôi đã thử điều đó và nhận thấy một sự thay đổi đáng kể về hành vi khi nói đến cài đặt ứng dụng:

Nếu bạn sử dụng ứng dụng tự động hoặc cài đặt ứng dụng trong phạm vi người dùng do VisualStudio cung cấp (kế thừa System.Configuration.ApplicationSettingsBase) thì EXE có tên mạnh sẽ tạo chính xác 1 thư mục bên trong% LOCALAPPDATA% có tên ví dụ: "YourApplication.exe_StrongName_kjsdfzsuzdfiuzgpoisdiufzsdouif" bất kể EXE ở đâu nằm.

Nhưng nếu không có tên mạnh, vị trí (= đường dẫn) của EXE sẽ được sử dụng để tạo giá trị băm đã khác giữa bản dựng DEBUG và RELEASE, tạo nhiều thư mục bên trong% LOCALAPPDATA% có tên như "YourApplication.exe_Url_dfg8778d6fs7g6d7f8g69sdf". Điều này làm cho nó không sử dụng được cho các triển khai ClickOnce trong đó thư mục cài đặt thay đổi theo mỗi bản cập nhật.


5

Tôi muốn thêm rằng nếu không có tên mạnh, bạn không thể sử dụng chuyển hướng ràng buộc trong các tệp cấu hình.

Điều này sẽ không hoạt động:

  <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>

Bạn cần có mã thông báo khóa công khai

  <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>

9
Chuyển hướng ràng buộc là không cần thiết nếu bạn không có tên mạnh.
trampster

0

Chỉ là một ví dụ: Tôi muốn đưa ra một câu trả lời nhấn mạnh hơn vào vấn đề bảo mật . Trong trường hợp chúng tôi tạo các hội đồng bằng mã nguồn mà chúng tôi không muốn sử dụng lại cho bên thứ ba nhưng chúng tôi muốn nó có thể kiểm tra được, chúng tôi có thể mạnh dạn ký một hội đồng và làm cho phần bên trong chỉ hiển thị cho các hội đồng đó với cùng một chữ ký.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.