Chính xác thì Assembly trong C # hoặc .NET là gì?


101

Bạn có thể vui lòng giải thích Assembly trong C # hoặc .NET là gì không?

  1. Nó bắt đầu từ đâu và kết thúc ở đâu?
  2. Tôi nên biết thông tin quan trọng nào về Assemblies?

5
Nói một cách chính xác, một assembly không phải là một khái niệm .NET chứ không phải là một khái niệm C #?
JeffH

14
@JeffH: khi tôi hỏi câu hỏi, tôi nghĩ đó là một khái niệm C #. Bây giờ tôi hiểu đó là một .NET. Tuy nhiên, kể từ khi tôi nghĩ rằng người khác có thể bị nhầm lẫn như tôi là, tôi cố tình không thay đổi nó cho Google để phù hợp với sai lầm này ...
Roee Adler

Câu trả lời:


114

Hợp ngữ là đầu ra được biên dịch của mã của bạn, thường là DLL, nhưng EXE của bạn cũng là một hợp ngữ. Đây là đơn vị triển khai nhỏ nhất cho bất kỳ dự án .NET nào.

Hợp ngữ thường chứa mã .NET bằng MSIL (ngôn ngữ Trung cấp của Microsoft) sẽ được biên dịch sang mã gốc ("JITted" - được biên dịch bởi trình biên dịch Just-In-Time) lần đầu tiên nó được thực thi trên một máy nhất định. Mã đã biên dịch đó cũng sẽ được lưu trữ trong assembly và được sử dụng lại trong các lần gọi tiếp theo.

Hợp ngữ cũng có thể chứa các tài nguyên như biểu tượng, bitmap, bảng chuỗi, v.v. Hơn nữa, assembly cũng chứa siêu dữ liệu trong bản kê khai assembly - thông tin như số phiên bản, tên mạnh, văn hóa, các cụm được tham chiếu, v.v.

Trong 99% trường hợp của bạn, một tập hợp bằng một tệp vật lý trên đĩa - trường hợp một tập hợp nhiều tệp (một tập hợp, được phân phối trên nhiều tệp duy nhất) dường như là một trường hợp cạnh khá kỳ quặc mà tôi đã chưa bao giờ gặp phải cho đến nay trong hơn 5 năm phát triển .NET của tôi.

Trong một tập hợp nhiều tệp sẽ vẫn chỉ có một tệp kê khai hợp ngữ trong DLL hoặc EXE và mã MSIL trong nhiều tệp netmodule.


1
@marc_s: Tôi nghĩ ý bạn là một tệp đa hợp. Có thể đóng gói nhiều tập hợp trong một tệp duy nhất thông qua các công cụ dòng lệnh của studio, nhưng không trực tiếp qua IDE.
Greg D

5
Một điều rất quan trọng trong một assembly là siêu dữ liệu trong bản kê khai assembly. Tệp kê khai có thông tin như phiên bản, tên mạnh, văn hóa, hội đồng được tham chiếu, v.v. Trong một hội đồng đa tệp sẽ vẫn chỉ có một tệp kê khai hợp ngữ trong dll hoặc exe và mã MSIL trong nhiều tệp .netmodule. Về cơ bản một hội đồng là đơn vị tối thiểu của việc triển khai trong> net
softveda

@marc_s: Tôi sẽ đánh giá cao nếu bạn thêm quan điểm của @ Pratik vào câu trả lời, cảm ơn
Roee Adler

@rax: xong rồi; @pratik: bây giờ bạn đang làm tôi bối rối: bạn lại nói về "tập hợp nhiều tệp", trong khi @GregD đề cập nó thực sự là "tệp đa hợp" - bây giờ là gì ?? (như tôi đã nói - Tôi chưa bao giờ gặp một con quái vật như vậy, vì vậy tôi một chút không rõ ràng cho dù đó là nhiều cụm cho mỗi tập tin, hoặc nhiều tác phẩm cho mỗi lắp ráp ....)
marc_s

3
"Đoạn mã đã biên dịch đó cũng sẽ được lưu trữ trong assembly và được sử dụng lại trong các lần gọi tiếp theo." Điều này gây hiểu lầm và / hoặc không rõ ràng lắm. Không có mã đã biên dịch nào được "lưu trữ" trong một hội đồng. Tôi nghĩ rằng bạn có thể đang đề cập đến cách mỗi phương thức / hàm được "ghép nối" với mã gốc khi nó được gọi lần đầu tiên. Sau đó, khi hợp ngữ nằm trong bộ nhớ, phiên bản mã gốc của phương thức được gọi. Nếu lắp ráp được dỡ bỏ và sau đó được tải lại, quá trình jit sẽ lại xảy ra một lần nữa. Tất nhiên điều này giả định rằng bạn không sử dụng NGEN để biên dịch trước các hợp ngữ của mình sang mã gốc (không được khuyến nghị).
Ash

13

.NET lắp ráp

Trong khuôn khổ Microsoft .NET, hợp ngữ là một thư viện mã được biên dịch một phần để sử dụng trong triển khai, lập phiên bản và bảo mật.


7

http://www.codeguru.com/columns/csharp_learning/article.php/c5845

Hợp ngữ là một tệp được trình biên dịch tự động tạo khi biên dịch thành công mọi ứng dụng .NET. Nó có thể là Thư viện liên kết động hoặc tệp thi hành. Nó chỉ được tạo một lần cho một ứng dụng và sau mỗi lần biên dịch tiếp theo, assembly sẽ được cập nhật.


2
Các tập hợp khác biệt với các tệp chứa chúng.
Greg D

1
@Raghav - Cập nhật ảnh của bạn với một cái gì đó bình thường vì chúa! Ở đây chúng tôi không đặt ra hộ chiếu, bạn biết đấy!
TheFlash

3

Đây là một lời giải thích khác về cấu tạo của .NET Assemblies, một trích dẫn nhỏ:

Khuôn khổ .NET bao gồm các khái niệm về mô-đun, hợp ngữ, cả hai đều lưu trữ siêu dữ liệu và thông tin kê khai. Một lắp ráp có thể chứa nhiều mô-đun. Visual C # chỉ tạo ra một mô-đun được trình biên dịch C # (csc.exe) biến thành một hợp ngữ, nhưng một hợp ngữ có thể liên kết nhiều mô-đun .NET với nhau thông qua công cụ dòng lệnh lắp ráp liên kết (al.exe). Ví dụ: mỗi tệp .cs mã nguồn của bạn có thể được biên dịch thành một mô-đun và được liên kết với nhau để tạo thành một hợp ngữ - một hợp ngữ chỉ là một tập hợp các mô-đun và tài nguyên. Tuy nhiên, một trong những mô-đun này; phải chứa thông tin siêu dữ liệu kê khai (xem bên dưới) để CLR hiểu được assembly.
....
Sau khi tạo .exe hoặc .dll mới bên trong VS.NET, bạn sẽ thấy tệp của mình xuất hiện bên trong thư mục bin. Mở nó trong notepad sẽ cho ra những thứ vô nghĩa, hoặc thậm chí bên trong một trình soạn thảo thập lục phân mà không biết cấu trúc của tệp, bạn cần một công cụ như ildasm.exe hoặc CFF explorer để tạo ý nghĩa từ nó. Cấu trúc của cụm như sau:

Tiêu đề PE Tiêu đề
CLR Tiêu đề
CLR Siêu dữ liệu
CLR
Mã IL
Dữ liệu gốc


Cái liên kết đó đưa tôi đến đâu vậy? Loại chuyển hướng vô hạn! Sau một vài lần chuyển hướng, tôi đến một trang có nội dung này . Không có cách nào để lấy lại URL ban đầu mà bạn đã đăng.
Sнаđошƒаӽ

2

Câu trả lời là để nắm bắt ngay lập tức.

Nói một cách đơn giản, nó là dự án được biên dịch liên quan đến các lớp của bạn và các tệp bổ sung, nếu có. Đó là, mỗi dự án trong một giải pháp là lắp ráp .

Hoặc cụ thể hơn,

Hợp ngữ là nơi một kiểu được lưu trữ trong hệ thống thịt. Assemblies là một cơ chế để triển khai mã. Ví dụ, hợp System.Data.dll ngữ chứa các kiểu để quản lý dữ liệu. Để sử dụng các kiểu trong các tập hợp khác, chúng phải được tham chiếu. - Nguồn

Làm thế nào để chúng tôi biết nó? Nếu bạn nhìn vào các thuộc tính của một dự án theo giải pháp, bạn có thể thấy những hình ảnh sau.

Khi bạn biên dịch dự án, nó sẽ chuyển sang DLL hoặc EXE .

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


1

Khi mã nguồn được biên dịch bởi trình biên dịch ngôn ngữ, nó sẽ tạo ra một hội được quản lý và MSIL (Ngôn ngữ trung gian của MisroSoft). Assembly đó chứa tệp .dll hoặc .exe . Assebmly có thể có hai loại Private AssemblyShared Assembly , shared Assembly được lưu trữ trong GAC (Global Assembly Cache) để bất kỳ ứng dụng nào cũng có thể tham chiếu đến nó trong khi private assembly được lưu trữ trong thư mục ứng dụng mà chỉ một Ứng dụng có thể sử dụng.


0

Hợp ngữ là một DLL hoặc EXE sẽ được tạo khi bạn xuất bản nó hoặc biên dịch ứng dụng của bạn.


0

Assembly là một tập hợp các đơn vị logic. Đơn vị logic đề cập đến các loại và tài nguyên cần thiết để xây dựng một ứng dụng và triển khai chúng bằng .Net framework. Về cơ bản, Assembly là một tập hợp các Exe và DLL. Nó có thể di động và thực thi được.


-1

Sau khi viết mã nguồn của chương trình (dự án) của bạn, một tệp được tạo ra có thể là DLL hoặc EXE tùy thuộc vào dự án của bạn. Nó chỉ thực hiện một lần cho một dự án duy nhất. Nó có hai loại 1: - đơn 2: - hợp ngữ đơn chia sẻ hoặc đa chương trình chỉ được sử dụng trong một chương trình duy nhất trong khi chia sẻ có thể được sử dụng cho đa chương trình


Sau khi viết mã nguồn của chương trình (dự án) của bạn, một tệp được tạo ra có thể là DLL hoặc EXE tùy thuộc vào dự án của bạn - sau khi viết mã nguồn? Dường như không phải là một dấu hiệu tốt về thời điểm tệp đó được tạo, BTW là phi vật chất cho câu hỏi.
Sнаđошƒаӽ
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.