Kiến trúc của C Sharp va .net
Trang 1 trong tổng số 1 trang
Kiến trúc của C Sharp va .net
Chương 1: Kiến trúc của C# và .NET
Phần 1: Mối quan hệ giữa C# và .NET
C# là một ngôn ngữ lập trình hướng đối tượng rất mới. Cấu trúc và lập luận của C# có đầy đủ các đặc tính của một ngôn ngữ lập trình hướng đối tượng trước đó ( C++, Java ). C# được thiết kế dùng cho nền .NET framework, một công nghệ mới và đầy triển vọng trong việc phát triển các ứng dụng hệ thống và mạng internet.
Bên cạnh đó, C# c̣òn là một ngôn ngữ lập trình hoàn toàn độc lập, điều đó có nghĩa là mã của C# được chạy trên .NET nhưng có những đặc tính của C# mà .NET không hỗ trợ ( quá tải toán tử ) hay là những đặc tính của .NET mà C# không hỗ trợ.
Phần 2: Cấu trúc và hoạt động của .NET
Chúng ta đă xem qua mối quan hệ giữa C# và .NET. Tất cả các mă của C# đều được biên dịch trên nền .NET. Để có thể làm việc hiệu quả với C#, chúng ta hăy xem qua cấu trúc và hoạt động của .NET.
2.1Khái niệm .NET
.NET là một môi trường quản ly, phát triển và thực thi các mă ngôn ngữ biết.NET. .NET cung cấp các khả năng về cấp phát và thu hồi bộ nhớ, quản ly cấp quyền, cung cấp và quản ly các nguồn tài nguyên. Trọng tâm của .NET bao gồm 2 thành phần là CLR ( the comon language runtime ) và .NET framework class lybary – Các thư viện cơ sở.
2.2Hoạt động của .NET
Mă chương tŕnh sẽ được biên dịch thành MSIL (Microsoft Intermediate Language).
Dịch IL thành nền cụ thể của .NET bằng CLR.
Có rất nhiều ngôn ngữ biết .NET, bao gồm C++, VB.NET, Managed C++, J+ and J#, Scripting languages, COM. Mă của chúng cũng sẽ được biên dịch thành IL. IL sẽ đảm bảo sự tương thích giữa các ngôn ngữ khác nhau. 1 thành phần của ngôn ngữ này có thể sử dụng thành phần và thuộc tính của thành phần nằm trong ngôn ngữ khác. Đây có thể nói là một khả năng kì diệu của C#. Để đạt được những điều đó, IL bao hàm những thuộc tính sau:
1. Hỗ trợ hướng đối tượng và giao diện ( interface )
2. Phân biệt giữa kiểu giá trị và kiểu tham chiếu
3. Định kiểu mạnh
4. Quản lỗi thông qua các ngoại lệ
5. Sử dụng các thuộc tính.
2.2.1Hỗ trợ hướng đối tượng và sử dụng giao diện.
IL tạo nhiều thuận lợi với các ngôn ngữ lập trình hướng đối tượng, không phải vô tình mà các thư viện cơ sở của .NET đều được viết = C# ( OOP ). IL cũng đưa ra y tưởng về giao diện (interface). Windows cũng hỗ trợ chuẩn giao diện gọi là COM.
COM là một nhị phân chuẩn cho phép các thành phần có thể tương tác với nhau mà không cần quan tâm đến ngôn ngữ nào đă tạo lập ra chúng. Điều đó có nghĩa là các mă dịch ra đều thống nhất và tương thích với COM. Tuy rằng COM không hỗ trợ tính thừa kế, chính ì́ thế COM đánh mất sự thuận lợi của lập tì́nh hướng đối tượng.
Tương thích chéo
Với khả năng hỗ trợ đồng thời nhiều loại ngôn ngữ, sau khi được biên dịch thành IL, mă của các ngôn ngữ khác nhau có thể làm việc cùng với nhau. Cụ thể là
Một lớp được tạo ra trong một ngôn ngữ có thể thừa kế từ một lớp được viết trong một ngôn ngữ khác.
Một lớp có thể chứa thể hiện của một lớp khác không quan tâm đến ngôn ngữ đă tạo ra hai lớp đó.
Một đối tượng có thể gọi trực tiếp phương thức của một đối tượng khác được viết bởi một ngôn ngữ khác.
Các đối tượng (hoặc các tham chiếu đến các đối tượng) có thể được truyền qua lại giữa các hàm
Bạn có khả năng bẫy lỗi từng bước chương tŕnh nguồn giữa các ngôn khác nhau
2.2.2 Phân biệt kiểu giá trị và kiểu tham chiếu.
IL có sự phân biệt rõ ràng đối với kiểu giá trị và kiểu tham chiếu. Trên IL, các kiểu giá trị vẫn được lưu trong vùng Stack, các kiểu tham chiếu vẫn được lưu trong vùng Heap.
2.2.3 Định kiểu mạnh.
IL có sự phân biệt rơ ràng đối với từng kiểu dữ liệu trả về, các kiểu dữ liệu luôn được đánh dấu cụ thể. Điều này là hoàn toàn phù hợp với đặc tính hỗ trợ nền cho nhiều loại ngôn ngữ của .NET. Một vấn đề nảy sinh đó là có những kiểu được hỗ trợ trong ngôn ngữ này nhưng lại không được hỗ trợ trong ngôn ngữ khác hoặc là nếu một lớp xuất thân hoặc chứa một lớp khác th́ nó cần phải biết tất cả các kiểu dùng trong các lớp đó.
CTS
Để đáp ứng được tác vụ đó, IL sử dụng tiến trình CTS – Common Type System, đây vốn là một bộ con trong .NET, đảm bảo tất cả các kiểu dữ liệu khác nhau của các ngôn ngữ khác nhau đều được biên dịch thành một kiểu chung trên nền .NET
CLS
CLS phối hợp với CTS để đảm bảo sự tương thích giữa các ngôn ngữ. CLS là một chuẩn mà tất cả các ngôn ngữ biết .NET đều phải tuân theo. CLS hoạt động theo 2 nguyên tắc
CLS không hoàn ṭan bó buộc các ngôn ngữ lập trình, điều này khiến cho các ngôn ngữ hoàn toàn có thể phát triển theo các chiều hướng riêng
CLS gắn một chuẩn lên các ngôn ngữ lập tŕnh biết .NET, điều này đảm bảo mă của các ngôn ngữ đó luôn được hỗ trợ khi biên dịch.
Garbare Collection
Garbage collector là một thành phần quản lí bộ nhớ của .NET.
Tốc độ hoạt động của C# hoàn toàn phụ thuộc vào Garbare collection, GC là một ứng dụng có mục đích giải phóng bộ nhớ trên nền .NET. Nguyên tắc làm việc của GC như sau.
Các mă sau khi được biên dịch, kết quả sẽ được đưa hoàn toàn vào Heap, khi Heap đầy, GC sẽ thực thi so sánh với các mă đang thực hiên, nếu như các kết quả không dùng đến, GC sẽ thực hiện nhiệm vụ dọn dẹp và lấy lại bộ nhớ,
2.2.4 Bắt lỗi xử dụng các ngoại lệ
.NET được thiết kế để đơn giản hoá quá tŕnh bẫy lỗi thông qua các ngoại lệ, ư tưởng ở đây là một vùng mă được thiết kế như là các thủ tục quản ngoại lệ, mỗi đoạn mă có thể giải quyết một điêu kiện lỗi riêng (ví dụ, một file không được t́m thấy, hoặc không được phép thực thi một số lệnh). Những điều kiện này có thể được định nghĩa kĩ hoặc sơ qua tuỳ bạn. Cấu trúc ngoại lệ bảo đảm rằng khi một điều kiện sinh lỗi xảy ra, ngay lập tức luồn thi hành sẽ nhảy đến thủ tục quản ngoại lệ.
2.2.5 Sử dụng các thuộc tính
Các thuộc tính trong IL cho phép người dùng có thể sử dụng dễ dàng hoặc có thể tự thiết lập các thuộc tính của riêng họ
Tiến trình biên dịch thành mă .NET – Common language runtime
CLR có nhiệm vụ biên dịch mă IL thành mă nền .NET. Đây là một tiến tŕnh biên dịch kiểu just in time ( JIT ), khác với kiểu thông dịch trong Java.
Thay vì phải dịch toàn bộ ứng dụng một lần, tŕnh biên dịch JIT sẽ biên dịch từng phần mă khi nó được gọi Khi mă nguồn được biên dich, mă kết quả của nó sẽ được lưu lại trong bộ nhớ cho tới khi thoát khỏi ứng dụng, và trong các lần xử ly tiếp theo, máy tính sẽ không phải biên dịch lại một lần nữa, đây là ly do các chương tŕnh .NET luôn chạy nhanh hơn trong những lần sau.
Một đặc điểm nữa là .NET luôn hỗ trợ tối ưu tuỳ vào loại vi xư ly, đối với các tiến tŕnh biên dịch các ngôn ngữ cấp cao xưa kia sẽ không tối ưu vào loại vi xử lư, nền .NET hỗ trợ tuỳ loại vi xử l mà đưa ra cách thức phù hợp.
Phần 3: Cách thức làm việc của một chương tŕnh C#
Trọng tâm phương pháp làm việc của C# xoay quanh khái niệm Assembly. Assembly là tập hợp mã đă được biên dịch sang .NET. 1 Assembly chứa nội dung thực thi chương trình hoặc các thư viện động. Assembly có thể được chứa trong nhiều file. Assembly cũng có thể chứa metadata dùng để mô tả các kiểu và phương thức được định nghĩa trong mă tương ứng. Assembly metadata này đựơc hiểu như là manifest, cho phép kiểm tra phiên bản và tính trạng của assembly:
Chỉ định thông tin, như là tên và phiên bản của assembly
Danh sách các kiểu được tập hợp bởi assembly
Danh sách các assembly khác được yêu cầu bởi assembly hiện tại
Danh sách mă truy vấn, mức độ bảo mật bao gồm mức độ được yêu cầu bởi assembly và quyền hạn cho phép của assembly đó
Phân loại Assembly
1)Private Assemblies
Private assemblies là kiểu đơn giản nhất. Nó chứa phần mềm và chỉ được dùng cho phần mềm đó. Với phần mô tả này bạn có thể chứa đựng các private assemblie cung cấp cho một ứng dụng kiểu thực thi và một số thư viện, các thư viện này chứa mă sẽ được thi hành bởi ứng dụng đó.
2)Shared Assemblies
Shared assemblies được dành cho các thư viện công cộng có thể dùng cho bất kì ứng dụng nào.
Tiến trình thực thi bởi một chương trình C#
Khi chương tŕnh được thực thi, CLR sẽ xác nhận đến các Assembly manifest và quyền hạn chạy của chương trinh trên hệ thống. Nếu hệ bảo vệ hệ thống kô cho phép chương trình chạy, chương trình sẽ kô chạy. Nếu được phép, CLR sẽ thực thi mă lệnh. Bit đầu tiên của code được nạp vào bộ nhớ và được biên dịch thành mă nhị phân từ IL bởi JIT. Sau khi được biên dịch, mă được thực thi và chứa trong bộ nhớ.
Các phương thức bảo vệ của .Net và OS với chương trình
Hệ thống đảm bảo rằng private assemblies sẽ không được dùng bởi phần mềm khác, bởi vì một ứng dụng chỉ có thể load private assemblies trong cùng folder với chương trình chính hoặc là trong một thư mục con của nó.
1 giải pháp đưa ra là các private assemblies của một phần mềm sẽ được cài đặt vào cùng một thư mục, nhưng kô thể đảm bảo rằng sẽ không có một gói phần mềm sửa chữa hoặc ghi đè lên private assemblie dành riêng cho một phần mềm khác. Lúc này OS cung cấp một khả năng cho phép mỗi chương tŕnh chỉ nhìn thấy một bộ assemblies cho dù bộ đó có bị cài đè và trùng tên với bộ ass trước
Bởi vì bất kì ứng dụng nào cũng có thể truy xuất một shared assembly, nên cần phải có các cơ chế để bảo vệ các rủi ro sau:
Tranh chấp tên, khi một công ty tạo ra các shared assembly trùng tên với các shared assembly sẵn có của bạn. Về mặt lí thuyết mă của bạn có thể truy xuất vào cả hai assembly này song đây có thể là một vấn đề phức tạp.
Lỗi của một assembly có thể bị ghi đè bởi một phiên bản khác của cùng same assembly - một phiên bản mới không tương thích với những ǵ sẵn có.
Giải pháp cho những vấn đề trên là đặt các shared assembly trong một cây thư mục đặt biệt của hệ thống, có thể xem như là assembly cache toàn cục. Không giống như các private assembly, nó không đơn giản là copy assembly sang một thư mục thích hợp - nó cần được cài đặt rõ ràng vào cache. Tiến tŕnh này có thể được thực thi bởi một số tiện ích của .NET, bao gồm luôn quá trình kiểm tra trên assembly, tương tự như cài đặt một thư mục trong assembly cache để đảm bảo tính toàn vẹn của assembly.
Để tránh tranh chấp tên, shared assemblies đưa ra một được quản lí dựa trên một khóa mật mă chính. Tên này được gọi là strong name, được bảo đảm về tính độc nhất, và phải được trích dẫn bởi ứng dụng muốn tham chiếu đến một shared assembly.
Vấn đề về tương thích với lỗi do ghi đè một assembly được đánh địa chỉ theo thông tín phiên bản trong assembly manifest, và cho phép cài đặt song song.
Ví dụ về quá tải toán tử trong C#:
Quote:
1: public class zzz
2: {
3: public static void Main()
4: {
5: yyy a = new yyy(10);
6: yyy b = new yyy(5);
7: yyy c;
8: c = a + b ;
9: System.Console.WriteLine(c.i);
10: }
11: }
12:
13: public class yyy
14: {
15: public int i;
16: public yyy(int j)
17: {
18: i = j;
19: }
20:
21: public static yyy operator + (yyy x , yyy y)
22: {
23: System.Console.WriteLine(x.i);
24: yyy z = new yyy(12);
25: return z;
26: }
27: }
Mặc dù chúng ta viết mã trong C# có quá tải toán tử như vậy, nhưng trình biên dịch C# sẽ phải dịch ra ngôn ngữ trung gian IL để thực thi trên môi trường .NET. Đoạn lệnh đã được biên dịch ra như sau:
Quote:
1: .assembly my_namespace {}
2: .class private auto ansi zzz extends [mscorlib]System.Object
3: {
4: .method public hidebysig static void vijay() il managed
5: {
6: .entrypoint
7: .locals (class yyy V_0,class yyy V_1,class yyy V_2)
8: ldc.i4.s 10
9: newobj instance void yyy::.ctor(int32)
10: stloc.0
11: ldc.i4.5
12: newobj instance void yyy::.ctor(int32)
13: stloc.1
14: ldloc.0
15: ldloc.1
16: call class yyy yyy::op_Addition(class yyy,class yyy)
17: stloc.2
18: ldloc.2
19: ldfld int32 yyy::i
20: call void [mscorlib]System.Console::WriteLine(int32)
21: ret
22: ret
23: }
24: }
25:
26: .class public auto ansi yyy extends [mscorlib]System.Object
27: {
28: .field public int32 i
29: .method public hidebysig specialname static class yyy op_Addition(class yyy x,class yyy y) il managed
30: {
31: .locals (class yyy V_0,class yyy V_1)
32: ldarg.0
33: ldfld int32 yyy::i
34: call void [mscorlib]System.Console::WriteLine(int32)
35: ldc.i4.s 12
36: newobj instance void yyy::.ctor(int32)
37: stloc.0
38: ldloc.0
39: stloc.1
40: ldloc.1
41: ret
42: }
43:
44: .method public hidebysig specialname rtspecialname instance void .ctor(int32 j) il managed
45: {
46: ldarg.0
47: call instance void [mscorlib]System.Object::.ctor()
48: ldarg.0
49: ldarg.1
50: stfld int32 yyy::i
51: ret
52: }
53: }
Phần 1: Mối quan hệ giữa C# và .NET
C# là một ngôn ngữ lập trình hướng đối tượng rất mới. Cấu trúc và lập luận của C# có đầy đủ các đặc tính của một ngôn ngữ lập trình hướng đối tượng trước đó ( C++, Java ). C# được thiết kế dùng cho nền .NET framework, một công nghệ mới và đầy triển vọng trong việc phát triển các ứng dụng hệ thống và mạng internet.
Bên cạnh đó, C# c̣òn là một ngôn ngữ lập trình hoàn toàn độc lập, điều đó có nghĩa là mã của C# được chạy trên .NET nhưng có những đặc tính của C# mà .NET không hỗ trợ ( quá tải toán tử ) hay là những đặc tính của .NET mà C# không hỗ trợ.
Phần 2: Cấu trúc và hoạt động của .NET
Chúng ta đă xem qua mối quan hệ giữa C# và .NET. Tất cả các mă của C# đều được biên dịch trên nền .NET. Để có thể làm việc hiệu quả với C#, chúng ta hăy xem qua cấu trúc và hoạt động của .NET.
2.1Khái niệm .NET
.NET là một môi trường quản ly, phát triển và thực thi các mă ngôn ngữ biết.NET. .NET cung cấp các khả năng về cấp phát và thu hồi bộ nhớ, quản ly cấp quyền, cung cấp và quản ly các nguồn tài nguyên. Trọng tâm của .NET bao gồm 2 thành phần là CLR ( the comon language runtime ) và .NET framework class lybary – Các thư viện cơ sở.
2.2Hoạt động của .NET
Mă chương tŕnh sẽ được biên dịch thành MSIL (Microsoft Intermediate Language).
Dịch IL thành nền cụ thể của .NET bằng CLR.
Có rất nhiều ngôn ngữ biết .NET, bao gồm C++, VB.NET, Managed C++, J+ and J#, Scripting languages, COM. Mă của chúng cũng sẽ được biên dịch thành IL. IL sẽ đảm bảo sự tương thích giữa các ngôn ngữ khác nhau. 1 thành phần của ngôn ngữ này có thể sử dụng thành phần và thuộc tính của thành phần nằm trong ngôn ngữ khác. Đây có thể nói là một khả năng kì diệu của C#. Để đạt được những điều đó, IL bao hàm những thuộc tính sau:
1. Hỗ trợ hướng đối tượng và giao diện ( interface )
2. Phân biệt giữa kiểu giá trị và kiểu tham chiếu
3. Định kiểu mạnh
4. Quản lỗi thông qua các ngoại lệ
5. Sử dụng các thuộc tính.
2.2.1Hỗ trợ hướng đối tượng và sử dụng giao diện.
IL tạo nhiều thuận lợi với các ngôn ngữ lập trình hướng đối tượng, không phải vô tình mà các thư viện cơ sở của .NET đều được viết = C# ( OOP ). IL cũng đưa ra y tưởng về giao diện (interface). Windows cũng hỗ trợ chuẩn giao diện gọi là COM.
COM là một nhị phân chuẩn cho phép các thành phần có thể tương tác với nhau mà không cần quan tâm đến ngôn ngữ nào đă tạo lập ra chúng. Điều đó có nghĩa là các mă dịch ra đều thống nhất và tương thích với COM. Tuy rằng COM không hỗ trợ tính thừa kế, chính ì́ thế COM đánh mất sự thuận lợi của lập tì́nh hướng đối tượng.
Tương thích chéo
Với khả năng hỗ trợ đồng thời nhiều loại ngôn ngữ, sau khi được biên dịch thành IL, mă của các ngôn ngữ khác nhau có thể làm việc cùng với nhau. Cụ thể là
Một lớp được tạo ra trong một ngôn ngữ có thể thừa kế từ một lớp được viết trong một ngôn ngữ khác.
Một lớp có thể chứa thể hiện của một lớp khác không quan tâm đến ngôn ngữ đă tạo ra hai lớp đó.
Một đối tượng có thể gọi trực tiếp phương thức của một đối tượng khác được viết bởi một ngôn ngữ khác.
Các đối tượng (hoặc các tham chiếu đến các đối tượng) có thể được truyền qua lại giữa các hàm
Bạn có khả năng bẫy lỗi từng bước chương tŕnh nguồn giữa các ngôn khác nhau
2.2.2 Phân biệt kiểu giá trị và kiểu tham chiếu.
IL có sự phân biệt rõ ràng đối với kiểu giá trị và kiểu tham chiếu. Trên IL, các kiểu giá trị vẫn được lưu trong vùng Stack, các kiểu tham chiếu vẫn được lưu trong vùng Heap.
2.2.3 Định kiểu mạnh.
IL có sự phân biệt rơ ràng đối với từng kiểu dữ liệu trả về, các kiểu dữ liệu luôn được đánh dấu cụ thể. Điều này là hoàn toàn phù hợp với đặc tính hỗ trợ nền cho nhiều loại ngôn ngữ của .NET. Một vấn đề nảy sinh đó là có những kiểu được hỗ trợ trong ngôn ngữ này nhưng lại không được hỗ trợ trong ngôn ngữ khác hoặc là nếu một lớp xuất thân hoặc chứa một lớp khác th́ nó cần phải biết tất cả các kiểu dùng trong các lớp đó.
CTS
Để đáp ứng được tác vụ đó, IL sử dụng tiến trình CTS – Common Type System, đây vốn là một bộ con trong .NET, đảm bảo tất cả các kiểu dữ liệu khác nhau của các ngôn ngữ khác nhau đều được biên dịch thành một kiểu chung trên nền .NET
CLS
CLS phối hợp với CTS để đảm bảo sự tương thích giữa các ngôn ngữ. CLS là một chuẩn mà tất cả các ngôn ngữ biết .NET đều phải tuân theo. CLS hoạt động theo 2 nguyên tắc
CLS không hoàn ṭan bó buộc các ngôn ngữ lập trình, điều này khiến cho các ngôn ngữ hoàn toàn có thể phát triển theo các chiều hướng riêng
CLS gắn một chuẩn lên các ngôn ngữ lập tŕnh biết .NET, điều này đảm bảo mă của các ngôn ngữ đó luôn được hỗ trợ khi biên dịch.
Garbare Collection
Garbage collector là một thành phần quản lí bộ nhớ của .NET.
Tốc độ hoạt động của C# hoàn toàn phụ thuộc vào Garbare collection, GC là một ứng dụng có mục đích giải phóng bộ nhớ trên nền .NET. Nguyên tắc làm việc của GC như sau.
Các mă sau khi được biên dịch, kết quả sẽ được đưa hoàn toàn vào Heap, khi Heap đầy, GC sẽ thực thi so sánh với các mă đang thực hiên, nếu như các kết quả không dùng đến, GC sẽ thực hiện nhiệm vụ dọn dẹp và lấy lại bộ nhớ,
2.2.4 Bắt lỗi xử dụng các ngoại lệ
.NET được thiết kế để đơn giản hoá quá tŕnh bẫy lỗi thông qua các ngoại lệ, ư tưởng ở đây là một vùng mă được thiết kế như là các thủ tục quản ngoại lệ, mỗi đoạn mă có thể giải quyết một điêu kiện lỗi riêng (ví dụ, một file không được t́m thấy, hoặc không được phép thực thi một số lệnh). Những điều kiện này có thể được định nghĩa kĩ hoặc sơ qua tuỳ bạn. Cấu trúc ngoại lệ bảo đảm rằng khi một điều kiện sinh lỗi xảy ra, ngay lập tức luồn thi hành sẽ nhảy đến thủ tục quản ngoại lệ.
2.2.5 Sử dụng các thuộc tính
Các thuộc tính trong IL cho phép người dùng có thể sử dụng dễ dàng hoặc có thể tự thiết lập các thuộc tính của riêng họ
Tiến trình biên dịch thành mă .NET – Common language runtime
CLR có nhiệm vụ biên dịch mă IL thành mă nền .NET. Đây là một tiến tŕnh biên dịch kiểu just in time ( JIT ), khác với kiểu thông dịch trong Java.
Thay vì phải dịch toàn bộ ứng dụng một lần, tŕnh biên dịch JIT sẽ biên dịch từng phần mă khi nó được gọi Khi mă nguồn được biên dich, mă kết quả của nó sẽ được lưu lại trong bộ nhớ cho tới khi thoát khỏi ứng dụng, và trong các lần xử ly tiếp theo, máy tính sẽ không phải biên dịch lại một lần nữa, đây là ly do các chương tŕnh .NET luôn chạy nhanh hơn trong những lần sau.
Một đặc điểm nữa là .NET luôn hỗ trợ tối ưu tuỳ vào loại vi xư ly, đối với các tiến tŕnh biên dịch các ngôn ngữ cấp cao xưa kia sẽ không tối ưu vào loại vi xử lư, nền .NET hỗ trợ tuỳ loại vi xử l mà đưa ra cách thức phù hợp.
Phần 3: Cách thức làm việc của một chương tŕnh C#
Trọng tâm phương pháp làm việc của C# xoay quanh khái niệm Assembly. Assembly là tập hợp mã đă được biên dịch sang .NET. 1 Assembly chứa nội dung thực thi chương trình hoặc các thư viện động. Assembly có thể được chứa trong nhiều file. Assembly cũng có thể chứa metadata dùng để mô tả các kiểu và phương thức được định nghĩa trong mă tương ứng. Assembly metadata này đựơc hiểu như là manifest, cho phép kiểm tra phiên bản và tính trạng của assembly:
Chỉ định thông tin, như là tên và phiên bản của assembly
Danh sách các kiểu được tập hợp bởi assembly
Danh sách các assembly khác được yêu cầu bởi assembly hiện tại
Danh sách mă truy vấn, mức độ bảo mật bao gồm mức độ được yêu cầu bởi assembly và quyền hạn cho phép của assembly đó
Phân loại Assembly
1)Private Assemblies
Private assemblies là kiểu đơn giản nhất. Nó chứa phần mềm và chỉ được dùng cho phần mềm đó. Với phần mô tả này bạn có thể chứa đựng các private assemblie cung cấp cho một ứng dụng kiểu thực thi và một số thư viện, các thư viện này chứa mă sẽ được thi hành bởi ứng dụng đó.
2)Shared Assemblies
Shared assemblies được dành cho các thư viện công cộng có thể dùng cho bất kì ứng dụng nào.
Tiến trình thực thi bởi một chương trình C#
Khi chương tŕnh được thực thi, CLR sẽ xác nhận đến các Assembly manifest và quyền hạn chạy của chương trinh trên hệ thống. Nếu hệ bảo vệ hệ thống kô cho phép chương trình chạy, chương trình sẽ kô chạy. Nếu được phép, CLR sẽ thực thi mă lệnh. Bit đầu tiên của code được nạp vào bộ nhớ và được biên dịch thành mă nhị phân từ IL bởi JIT. Sau khi được biên dịch, mă được thực thi và chứa trong bộ nhớ.
Các phương thức bảo vệ của .Net và OS với chương trình
Hệ thống đảm bảo rằng private assemblies sẽ không được dùng bởi phần mềm khác, bởi vì một ứng dụng chỉ có thể load private assemblies trong cùng folder với chương trình chính hoặc là trong một thư mục con của nó.
1 giải pháp đưa ra là các private assemblies của một phần mềm sẽ được cài đặt vào cùng một thư mục, nhưng kô thể đảm bảo rằng sẽ không có một gói phần mềm sửa chữa hoặc ghi đè lên private assemblie dành riêng cho một phần mềm khác. Lúc này OS cung cấp một khả năng cho phép mỗi chương tŕnh chỉ nhìn thấy một bộ assemblies cho dù bộ đó có bị cài đè và trùng tên với bộ ass trước
Bởi vì bất kì ứng dụng nào cũng có thể truy xuất một shared assembly, nên cần phải có các cơ chế để bảo vệ các rủi ro sau:
Tranh chấp tên, khi một công ty tạo ra các shared assembly trùng tên với các shared assembly sẵn có của bạn. Về mặt lí thuyết mă của bạn có thể truy xuất vào cả hai assembly này song đây có thể là một vấn đề phức tạp.
Lỗi của một assembly có thể bị ghi đè bởi một phiên bản khác của cùng same assembly - một phiên bản mới không tương thích với những ǵ sẵn có.
Giải pháp cho những vấn đề trên là đặt các shared assembly trong một cây thư mục đặt biệt của hệ thống, có thể xem như là assembly cache toàn cục. Không giống như các private assembly, nó không đơn giản là copy assembly sang một thư mục thích hợp - nó cần được cài đặt rõ ràng vào cache. Tiến tŕnh này có thể được thực thi bởi một số tiện ích của .NET, bao gồm luôn quá trình kiểm tra trên assembly, tương tự như cài đặt một thư mục trong assembly cache để đảm bảo tính toàn vẹn của assembly.
Để tránh tranh chấp tên, shared assemblies đưa ra một được quản lí dựa trên một khóa mật mă chính. Tên này được gọi là strong name, được bảo đảm về tính độc nhất, và phải được trích dẫn bởi ứng dụng muốn tham chiếu đến một shared assembly.
Vấn đề về tương thích với lỗi do ghi đè một assembly được đánh địa chỉ theo thông tín phiên bản trong assembly manifest, và cho phép cài đặt song song.
Ví dụ về quá tải toán tử trong C#:
Quote:
1: public class zzz
2: {
3: public static void Main()
4: {
5: yyy a = new yyy(10);
6: yyy b = new yyy(5);
7: yyy c;
8: c = a + b ;
9: System.Console.WriteLine(c.i);
10: }
11: }
12:
13: public class yyy
14: {
15: public int i;
16: public yyy(int j)
17: {
18: i = j;
19: }
20:
21: public static yyy operator + (yyy x , yyy y)
22: {
23: System.Console.WriteLine(x.i);
24: yyy z = new yyy(12);
25: return z;
26: }
27: }
Mặc dù chúng ta viết mã trong C# có quá tải toán tử như vậy, nhưng trình biên dịch C# sẽ phải dịch ra ngôn ngữ trung gian IL để thực thi trên môi trường .NET. Đoạn lệnh đã được biên dịch ra như sau:
Quote:
1: .assembly my_namespace {}
2: .class private auto ansi zzz extends [mscorlib]System.Object
3: {
4: .method public hidebysig static void vijay() il managed
5: {
6: .entrypoint
7: .locals (class yyy V_0,class yyy V_1,class yyy V_2)
8: ldc.i4.s 10
9: newobj instance void yyy::.ctor(int32)
10: stloc.0
11: ldc.i4.5
12: newobj instance void yyy::.ctor(int32)
13: stloc.1
14: ldloc.0
15: ldloc.1
16: call class yyy yyy::op_Addition(class yyy,class yyy)
17: stloc.2
18: ldloc.2
19: ldfld int32 yyy::i
20: call void [mscorlib]System.Console::WriteLine(int32)
21: ret
22: ret
23: }
24: }
25:
26: .class public auto ansi yyy extends [mscorlib]System.Object
27: {
28: .field public int32 i
29: .method public hidebysig specialname static class yyy op_Addition(class yyy x,class yyy y) il managed
30: {
31: .locals (class yyy V_0,class yyy V_1)
32: ldarg.0
33: ldfld int32 yyy::i
34: call void [mscorlib]System.Console::WriteLine(int32)
35: ldc.i4.s 12
36: newobj instance void yyy::.ctor(int32)
37: stloc.0
38: ldloc.0
39: stloc.1
40: ldloc.1
41: ret
42: }
43:
44: .method public hidebysig specialname rtspecialname instance void .ctor(int32 j) il managed
45: {
46: ldarg.0
47: call instance void [mscorlib]System.Object::.ctor()
48: ldarg.0
49: ldarg.1
50: stfld int32 yyy::i
51: ret
52: }
53: }
phung minh thanh(PT1)- Tổng số bài gửi : 3
Join date : 21/09/2010
Age : 33
Đến từ : Bình Thuận
Similar topics
» KIẾN TRÚC MÁY ẢO
» Thảo luận những vấn đề khác của Môn học
» Vai trò của kiến trúc máy ảo trong tổ chức HĐH & ích lợi
» Thảo luận Bài 3
» Nguyên lý và những thế mạnh của kiến trúc máy ảo
» Thảo luận những vấn đề khác của Môn học
» Vai trò của kiến trúc máy ảo trong tổ chức HĐH & ích lợi
» Thảo luận Bài 3
» Nguyên lý và những thế mạnh của kiến trúc máy ảo
Trang 1 trong tổng số 1 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết