2009-08-05 35 views
8

Cách thức các assembly được giải quyết trong .NET. Tôi có nghĩa là, làm thế nào là một hội đồng với một tên đủ điều kiện giải quyết. Tôi bối rối về các mã thông báo khóa công khai/riêng tư và đặt tên mạnh. Cảm ơnLắp ráp được giải quyết bằng .NET như thế nào?

CHỈNH SỬA: Tôi cũng đã đọc về ký chậm và các nội dung tương tự. Mọi người có thực sự sử dụng nó không? (Có ai thực sự sử dụng ký trễ) Ai tạo ra chìa khóa để ký một hội đồng. Tôi xin lỗi nếu tôi hỏi quá nhiều câu hỏi. Nhưng, tôi bối rối về chuyện này.

Trả lời

14

Đặt tên mạnh được sử dụng cùng với "mã thông báo khóa công khai" để tạo một cụm tên hiển thị đầy đủ (mscorlib, version=2.0.0.0, Culture=neutral, PublicKeyToken=b4778,.....). Điều này cho phép chúng tôi có nhiều phiên bản của cùng một assembly bên cạnh trong cùng một thư mục ứng dụng.

Mã thông báo khóa công khai (và do đó, kỹ thuật đặt tên chuỗi) cũng cho phép trình tải .NET phát hiện xem có ai đã giả mạo nội dung lắp ráp của bạn kể từ khi bạn phân phối nó hay không. Điều này đúng bởi vì khi bạn ký một assembly với "token riêng" của bạn, trình biên dịch sẽ tạo ra một giá trị băm mà nó nhúng vào siêu dữ liệu lắp ráp mô tả phần công khai của "token riêng" của bạn. Sau đó, trình nạp có thể sử dụng giá trị này để xác định xem hội đồng của bạn đã được sửa đổi hay chưa.

Về hội giải quyết, có một vài điều cơ bản cần xem xét:

  • Probing Bộ nạp cố gắng xác định vị trí lắp ráp sử dụng một thư mục cơ bản "thăm dò" kỹ thuật. Điều này có nghĩa là nó sẽ cố gắng xác định vị trí "MyAssembly.dll" (ví dụ) trong thư mục khởi động của ứng dụng, nếu không có, thì trong các thư mục con bên dưới thư mục đó. Nếu thăm dò không tìm được "MyAssembly.dll" thì sự kiện AssemblyResolve của AppDomain bị kích hoạt.

  • cấu hình máy/User/System Các machine.config, user.configsystem.config được các file cấu hình lưu trữ cục bộ trên hệ thống mà người ta có thể sử dụng để thay đổi hành vi của resolver lắp ráp trên một "máy", "người sử dụng" hoặc cài đặt "toàn hệ thống".

  • Chính sách xuất bản Người ta có thể sử dụng "<assemblyIdentity>" token XML trong tập tin cấu hình của ứng dụng của bạn (ví dụ, "MyApp.exe.config") để trỏ đến phân giải lên một phiên bản nào đó của một assembly hoặc nạp một assembly từ một vị trí khác.

  • Tuỳ chỉnh độ phân giải Xử lý các "AssemblyResolve" sự kiện của AppDomain. Sự kiện này được nâng lên bất cứ khi nào một hội đồng không thể được giải quyết bằng các phương pháp "truyền thống"

Đến nay, cơ chế ít phức tạp nhất là xử lý sự kiện "AssemblyResolve".

Để tóm tắt, trình phân giải sẽ tìm trong thư mục hiện tại hoặc bộ nhớ cache lắp ráp toàn cầu, quy trình chính sách và sau đó cuối cùng cho phép giải quyết tùy chỉnh.

+0

"cho phép trình nạp .NET phát hiện xem có ai đã giả mạo nội dung lắp ráp của bạn ..." không nhận được điều đó hay không. –

+2

Chắc chắn. Về cơ bản khi bạn biên dịch assembly của bạn với giá trị băm tên mạnh (bạn cũng có thể sử dụng tiện ích dòng lệnh sn.exe), giá trị băm được ghi vào siêu dữ liệu của assembly, mô tả phiên bản, văn hóa, tên và giá trị token của nó. Khi bộ tải nạp assembly của bạn, nó sẽ kiểm tra xem assembly của bạn có mã thông báo khóa công khai hay không, và chạy cùng một thuật toán băm trên assembly của bạn, so sánh nó với metadata trong assembly và từ chối tải assembly nếu chúng khác nhau. Đó là cách tải phát hiện "giả mạo". Nó rất hạn chế như bạn có thể thấy, nhưng đủ cho bây giờ. –

+0

Trên bề mặt, nó trông giống như một cách để bảo vệ mã .NET của chúng tôi. Nhưng than ôi, sự phấn khích sẽ biến mất nhanh chóng và bạn sẽ sớm nhận ra rằng obfuscation là điều tốt nhất tiếp theo. –

1

Việc giải quyết hội có thể bao gồm một số bước, tùy thuộc vào nơi lắp ráp mà nó đang cố gắng tải (GAC, thư mục cơ sở ứng dụng, thư mục con hoặc thư mục khác cách thư mục ứng dụng cơ sở của bạn).

Đây là bài viết hay về cách bạn có thể chỉ định vị trí .Net tìm kiếm các hội đồng của bạn. MSDN Article

Nếu bạn muốn thời gian chạy giải quyết hội đồng không được lưu trữ trong thư mục cơ sở ứng dụng hoặc GAC thì bạn cần phải đăng ký sự kiện AppDomain. Sau đó bạn sẽ phản ứng trên sự kiện đó bằng cách kiểm tra xem tệp có tồn tại ở vị trí khác của bạn không và sau đó trả về nó bằng Assembly.LoadFrom (thePath).

Chỉ cần để thêm vào câu trả lời này nữa là liên kết này nứt rằng nên tổng hợp toàn bộ đặt tên mạnh mẽ với các phím rất độc đáo dành cho bạn: Strong Naming - keys etc..

Mọi thắc mắc từ này, chỉ cần hỏi!

+0

Ai tạo khóa để ký một hội đồng? –

2

Bài viết sau đây trên MSDN sẽ giúp bạn ra: độ phân giải

http://msdn.microsoft.com/en-us/library/yx7xezcf(VS.71).aspx

hội trong .NET có thể khá phức tạp, như lắp ráp có thể được đặt trong một loạt các địa điểm bao gồm GAC, colocated với thực hiện lắp ráp, bóng sao chép, vv Quá trình chung được gọi là quá trình Fusion, và đảm bảo rằng các biện pháp an ninh thích hợp được đáp ứng khi tải hội đồng.

Các vấn đề liên quan