2012-02-14 37 views
40

Tôi đã cố gắng quấn quanh đầu câu trả lời 'đúng' cho điều này? có một vài chủ đề trên stackoverflow bao gồm điều này, nhưng điều đó xung đột phần nào với tài liệu msdn..NET Module vs Assembly

ví dụ, lưu ý các biểu đồ trong các câu trả lời thứ 2 cho câu hỏi của mình: What is a Managed Module (compared to an Assembly)?

Bây giờ nhìn vào sơ đồ MSDN: http://msdn.microsoft.com/en-us/library/zst29sk2(VS.100).aspx

sơ đồ MSDN ngụ ý rằng một hội duy nhất-file không bao gồm của một mô-đun, nhưng thay vì một tệp kê khai, mã il, loại siêu dữ liệu, v.v. Điều này khác với nhiều bài viết khác tôi đã đọc, nói rằng một tập hợp một tệp có một mô-đun.

Câu trả lời là gì? Nếu câu trả lời là 'cả hai', thì mô-đun có phải là một tệp phyical riêng biệt được liên kết thông qua tệp kê khai assembly không?

+0

bản sao có thể có của [Mô-đun trong .NET là gì?] (Http://stackoverflow.com/questions/645728/what-is-a-module-in-net) –

Trả lời

31

Mỗi lắp ráp có ít nhất một mô-đun. Nó là một chi tiết thực hiện rất vô hình. Nhưng bạn có thể nhìn thấy nó khi bạn sử dụng Reflection.Emit. Từ mã mẫu cho số AssemblyBuilder class:

AssemblyName aName = new AssemblyName("DynamicAssemblyExample"); 
AssemblyBuilder ab = 
    AppDomain.CurrentDomain.DefineDynamicAssembly(
     aName, 
     AssemblyBuilderAccess.RunAndSave); 

// For a single-module assembly, the module name is usually 
// the assembly name plus an extension. 
ModuleBuilder mb = 
    ab.DefineDynamicModule(aName.Name, aName.Name + ".dll"); 

TypeBuilder tb = mb.DefineType(
    "MyDynamicType", 
    TypeAttributes.Public); 

Lưu ý việc sử dụng lớp Mô-đun, loại được thêm vào mô-đun. Đó là một hội đồng có thể chứa nhiều mô-đun là khá không liên quan, môi trường xây dựng không hỗ trợ nó. Không chỉ IDE, MSBuild cũng không hỗ trợ nó. Bạn sẽ phải tự viết một kịch bản xây dựng để sử dụng al.exe, the assembly linker. Không có lý do chính đáng để làm điều này mà tôi có thể nghĩ đến, tất cả các trình biên dịch .NET đã biết cách tạo ra một assembly đơn trực tiếp. Al.exe là một công cụ bootstrapping điển hình, có thể được sử dụng để xây dựng mscorlib.dll.

+2

Tôi đã tự hỏi về phụ thuộc vòng tròn trong một lúc nhưng sợ hỏi. Tôi không biết ** tại sao ** mscorlib và hệ thống có phụ thuộc vòng tròn nhưng bạn có thể giải thích ngắn gọn cách tôi có thể duy trì hai dự án (trong cùng một giải pháp hay không) tham chiếu lẫn nhau? –

+0

@RaheelKhan câu trả lời cho điều đó là "Bạn không", tái cấu trúc các phần phổ biến thành một hội đồng thứ 3 mà cả hai hội đồng có thể tham khảo. Một ví dụ thế giới thực rất phổ biến về điều này là một kiến ​​trúc plugin, cả assembly của bạn và assembly khác tham chiếu đến một assembly API thứ 3 định nghĩa tất cả các giao diện. Sau đó bạn có thể sử dụng sự phản chiếu để tạo ra các thể hiện của plugin và đưa nó vào giao diện chung cả chương trình của bạn và phần chia sẻ của plugin. –

11

Mô-đun là bộ sưu tập mã hợp lý trong một hội đồng. Bạn có thể có nhiều mô-đun bên trong một hội đồng, và mỗi mô-đun có thể được viết bằng ngôn ngữ khác nhau. NET (VS, theo như tôi biết, không hỗ trợ tạo ra các hội đồng đa mô-đun).

Tập hợp chứa mô-đun. Các module chứa các lớp. Các lớp chứa hàm.

Từ: What is a module in .NET?

Thật Từ: Bing tìm kiếm "mô-đun .NET vs lắp ráp"

34

Trong .net sự khác biệt giữa một lắp ráp và mô-đun là một module không chứa manifest.

//Copied from CLR via C# 

là gì manifest?

Tệp kê khai là một bộ khác gồm bảng siêu dữ liệu về cơ bản chứa tên của các tệp là một phần của hội đồng. Họ cũng mô tả phiên bản, văn hóa, nhà xuất bản, loại được xuất công khai của hội đồng và tất cả các tệp mà bao gồm lắp ráp.

CLR hoạt động trên các cụm; nghĩa là, CLR luôn tải tệp có chứa các bảng siêu dữ liệu manifest trước rồi sử dụng tệp kê khai để lấy tên của các tệp/mô-đun khác trong assembly.

Cách kết hợp các mô-đun để tạo thành một hội?

Sử dụng biên dịch C#

Để hiểu làm thế nào để xây dựng một multifile/multimodule lắp ráp, hãy giả sử rằng chúng ta có file mã hai nguồn:

■■ RUT.cs, mà chứa ít được sử dụng các loại

■■ FUT.cs, chứa các loại được sử dụng thường xuyên

Hãy biên dịch các loại hiếm khi được sử dụng o mô-đun riêng của họ để người dùng lắp ráp sẽ không cần để triển khai mô-đun này nếu họ không bao giờ truy cập các loại hiếm khi được sử dụng.

csc /t:module RUT.cs 

Dòng này làm trình biên dịch C# tạo tệp RUT.netmodule. Tệp này là tệp DLL PE chuẩn, nhưng, bản thân nó, CLR không thể tải tệp đó. Tiếp theo, hãy biên soạn các loại được sử dụng thường xuyên thành mô-đun riêng của chúng. Chúng tôi sẽ làm cho mô-đun này là người giữ bản kê khai của hội đồng vì các loại được sử dụng thường xuyên. Thực tế, vì mô-đun này giờ đây sẽ đại diện cho toàn bộ hội đồng, tôi sẽ thay đổi tên của tệp đầu ra thành MultiFileLibrary.dll thay vì gọi nó là FUT.dll.

csc /out:MultiFileLibrary.dll /t:library /addmodule:RUT.netmodule FUT.cs 

Dòng này yêu cầu trình biên dịch C# biên dịch tệp FUT.cs để tạo tệp MultiFileLibrary.dll. Bởi vì /t: thư viện được chỉ định, tệp DLL PE chứa bảng siêu dữ liệu tệp kê khai được phát ra vào tệp MultiFileLibrary.dll. Công tắc /addmodule:RUT .netmodule cho trình biên dịch biết rằng RUT.netmodule là một tệp cần được coi là một phần của hội đồng. Cụ thể, khóa chuyển đổi /addmodule yêu cầu trình biên dịch thêm tệp vào bảng siêu dữ liệu tệp kê khai FileDef và thêm các loại xuất công khai của RUT.netmodule vào bảng siêu dữ liệu tệp kê khai ExportedTypesDef.

Sau khi trình biên dịch hoàn thành tất cả quá trình xử lý, hai tệp được hiển thị trong Hình 2-1 được tạo. Mô-đun bên phải chứa tệp kê khai.

enter image description here

Sử dụng Linker hội

Tiện ích AL.exe có thể sản xuất một EXE hoặc một file PE DLL chỉ chứa một biểu hiện mô tả loại trong module khác. Để hiểu cách AL.exe hoạt động, hãy thay đổi cách lắp ráp MultiFileLibrary.dll.

csc /t:module RUT.cs 
csc /t:module FUT.cs 
al /out: MultiFileLibrary.dll /t:library FUT.netmodule RUT.netmodule 

Hình 2-3 cho thấy các tệp kết quả từ việc thực hiện các câu lệnh này.

enter image description here

tôi sẽ đề nghị bạn đọc CHƯƠNG 2: Xây dựng, bao bì, Triển khai, và Ứng dụng Quản lý và loại từ CLR thông qua C# bởi Jeffrey Richter để hiểu được khái niệm một cách chi tiết.

+1

downvoters nên viết lý do của họ. –

+1

Đây phải là câu trả lời được chấp nhận. – fernacolo

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