Chuyển đến nội dung chính

C++ và các khái niệm cơ bản

.NET là gì?
Một cách hiểu đơn giản, Microsoft ® .NET là một chiến lược của Microsoft cho việc phân phối phần mềm như là một dịch vụ.



Một số điểm then chốt của .NET được mô tả sau đây:

· Microsoft .NET platform


Bao gồm cơ sở hạ tầng và các công cụ để xây dựng và vận hành một thế hệ mới các dịch vụ, các khối kiến trúc dịch vụ .NET và các thiết bị phần mềm .NET. Với nền tảng .NET, mọi thứ đã được sẵn sàng cho một thế hệ mới các thiết bị internet thông minh.

· Các sản phẩm và dịch vụ của Microsoft.NET
Bao gồm Microsoft ® Windows .NET (với nhân được tích hợp các khối kiến trúc dịch vụ), msn .NET, Microsoft ® Office .NET, Microsoft ® Visual Studio .NET, …

· Các dịch vụ .NET của hãng thứ ba
Một lượng lớn các cộng sự và nhà phát triển sẽ có cơ hội để tạo ra các dịch vụ cao cấp dựa trên .NET platform .

.NET Framework là gì?
.NET Framework là một mơi trường xây dựng, phát triển và thực thi các web service (dịch vụ web) và các ứng dụng khác. Nó bao gồm ba phần chính: Common Language Runtime, các lớp Framework và ASP .NET.

Có phải .NET Framework chỉ áp dụng cho những người xây dựng web site?
.NET Framework cho phép bạn tạo nên những ứng dụng web tuyệt vời. Tuy nhiên nó cũng giúp bạn tạo nên những ứng dụng như trước đây. Nếu bạn viết bất kỳ một phần mềm trên Windows nào (dùng ATL/COM | Active Template Library/Component Object Model, MFC | Microsoft Foundation Classes, Microsoft VisualBasic ®, hay thậm chí là Microsoft Win32 ®) thì .NET đều đưa ra nhiều thuận lợi theo phương pháp đang xây dựng ứng dụng. Dĩ nhiên, nếu bạn đang phát triển web site, .NET Framework sẽ có nhiều thứ hấp dẫn bạn, ví dụ như ASP.NET.

.NET hỗ trợ những ngôn ngữ nào?
.NET Framework trung tính về mặt ngôn ngữ, nghĩa là bất cứ ngôn ngữ nào cũng là mục tiêu hỗ trợ của .NET Framework. Hiện nay, bạn có thể xây dựng chương trình .NET bằng một vài ngôn ngữ bao gồm: Visual C++ .NET, Visual Basic .NET, JScript và C# .NET. Một số lớn các ngôn ngữ lập trình khác cũng được hỗ trợ, ví dụ: Cobol, Eiffel, Perl, Python, Smalltalk,…

Đâu là mối quan hệ giữa .NET framework và các dịch vụ COM+ ?
.NET Framework cho phép bạn tồn quyền truy xuất đến các dịch vụ COM+ (Component Object Model plus Services) đồng thời hỗ trợ xây dựng các thành phần dịch vụ trở nên dễ dàng hơn. Các thành phần của .NET Framework cũng có thể được nhúng vào trong ứng dụng COM+. Ở đây, chúng có thể tận dụng tính năng của các thành phần COM+ như: transactions, object pooling, events, …

Đâu là mối quan hệ giữa .NET Framework và DCOM?
DCOM là cơ sở hạ tầng COM cho việc giao tiếp xuyên tiến trình (cross process communication). .NET Framework hỗ trợ một số kênh khả cắm (pluggable channels) và dạng thức cho giao tiếp xuyên tiến trình. Khi thực hiện việc chuyển tiếp giữa managed code và unmanaged code, .NET framework dùng cơ sở hạ tầng COM hay DCOM. .NETcũng hỗ trợ SOAP (Simple Object Access Protocol - giao tiếp truy xuất đối tượng đơn giản) cho giao tiếp xuyên tiến trình.

Có phải .NET Framework chỉ là một tên mới của Windows DNA?
Không. Windows DNA chỉ là một kiến trúc choviệc xây dựng các ứng dụng web ghép đôi chặt (tightly – coupled) hay phân tán (distributed).Khi nhu cầu của ứng dụng tăng lên, Microsoft phát triển kiến trúc .NET. .NET framework là một phần của kiến trúc .NET.

Common Language Runtime (CLR) là gì ?
Common language runtime là một môi trường thực thi cho các ứng dụng .NET Framework. Nó bao gồm các dịch vụ sau:
· Quản lý mã (code management): bao gồm việc nạp và thực thi.
· Cơ lập bộ nhớ cho các ứng dụng.
· Kiểm tra an tồn kiểu.
· Chuyển đổi từ IL (intermediate language) sang mã riêng.
· Truy xuất đến siêu dữ liệu (metadata).
· Quản lý bộ nhớ cho các đối tượng được quản lý.
· Kiểm soát lỗi, bao gồm cả kiểm soát lỗi xuyên ngôn ngữ (cross – language exception).
· Liên tác vụ giữa managed code, đối tượng COM, và các DLL đã có sẵn.
· Tự động hóa các lớp đối tượng.
· Hỗ trợ các dịch vụ cho nhà phát triển (profiling, debugging,…)

Hệ thống kiểu công cộng (Common Type System – CTS) là gì?
Hệ thống kiểu công cộng là một hệ thống gồm nhiều kiểu dữ liệu được xây dựng sẵn trong CLR.Nó hỗ trợ các kiểu và các tác vụ trong hầu hết các ngôn ngữ lập trình. CTS hỗ trợ rất nhiều hiện thực hồn chỉnh của các ngơn ngữ lập trình.

Đặc tả ngôn ngữ công cộng (Common Language Specification – CLS) là gì?
Đặc tả ngôn ngữ công cộng là một tập hợp các cấu trúc và quy tắc phục vụ cho các nhà lập trình thư viện (library writer) hay các nhà lập trình trình biên dịch (compiler writer). Đặc tả này cho phép sử dụng bất kỳ ngôn ngữ nào hỗ trợ CLS để viết chương trình, và có thể tích hợp các ngôn ngữ đó với nhau. CLS là một tập con của CTS.CLS cũng quan trọng đối với các nhà phát triển ứng dụng, những người đang viết mã cho các nhà phát triển khác sử dụng. Khi nhà phát triển thiết kế một API (Application Programming Interface – giao diện lập trình ứng dụng) tuân theo CLS, thì API đó có thể được dùng bởi bất cứ ngôn ngữ nào được CLS hỗ trợ.


Ngôn ngữ trung gian của Microsoft (Microsoft Intermediate Language – MSIL) là gì?


MSIL là một tập lệnh không phụ thuộc vào CPU do chương trình của .NET Framework được biên dịch sang. Nó bao gồm các lệnh để nạp, chứa, khởi tạo và gọi các phương thức của đối tượng. Kết hợp với siêu dữ liệu và CTS, MSIL cho phép hiện thực việc tích hợp xuyên ngôn ngữ. Trước khi thực thi, MSIL được chuyển sang mã máy. Tuy nhiên đây không phải là quá trình thông dịch.

Managed code và managed data là gì?
Managed code là mã lệnh được viết nhắm đến các dịch vụ của CLR. Để đạt được mục tiêu này, mã lệnh phải cung cấp các thông tin cho môi trường thực thi ở mức thấp nhất. Tất cả mã C#, Visual Basic .NET, JScript .NET mặc định đều là managed code. Visual C++ .NET mặc định không phải là managed code, nhưng trình biên dịch có thể tạo ra managed code bằng cách xác định một khoá chuyển trên dòng lệnh (/CLR).

Có liên quan rất gần với managed code là managed data. Manage data là dữ liệu được cấp phát và giải phóng bởi trình dọn dẹp rác (garbage collector) của CLR. Dữ liệu của C#, Visual Basic .NET, JScript .NET mặc định đều là managed data. Tuy nhiên, dữ liệu của C# có thể được đánh dấu là unmanaged bằng cách dùng một từ khoá đặc biệt. Dữ liệu của Visual C++ .NET mặc định là unmanaged (kể cả khi dùng với khoá chuyển /CLR), nhưng khi dùng Managed Extensions cho C++, một lớp có thể được đánh dấu là managed bằng cách dùng từ khoá gc. Tên của từ khoá này cũng gợi cho ta biết bộ nhớ dùng cho đối tượng của lớp được quản lý bởi garbage collector. Thêm vào đó, lớp cũng sẽ trở thành một thành phần tham gia hoàn toàn vào cộng đồng .NET Framework cùng với các thuận lợi và hạn chế tương ứng. Một ví dụ về lợi ích là khả năng liên tác đến các lớp viết bằng một ngôn ngữ khác, chẳng hạn một lớp C++ managed có thể được kế thừa từ một lớp Visual Basic). Một ví dụ về sự hạn chế là một lớp managed chỉ có thể được kế thừa từ một lớp cơ sở.

Assembly là gì?
Assembly là một khối chức năng chính của một ứng dụng .NET Framework. Nó là một tập hợp các chức năng được xây dựng, phát triển như một đơn vị thực thi đơn. Tất cả các kiểu managed và tài nguyên được đánh dấu để chỉ được truy xuất trong đơn vị thực thi hay bởi mã lệnh bên ngoài.
Các assembly tự mô tả bởi các phần sau:
· Thiết lập định danh (dưới dạng text), phiên bản, chữ ký số (nếu assembly được chia sẻ thông qua ứng dụng).
· Định nghĩa file nào chứa hiện thực của assembly.
· Chỉ định kiểu và tài nguyên cấu thành nên assembly, bao gồm những thứ được xuất ra bởi assembly.
· Ghi nhận thời gian biên dịch phụ thuộc trên các assembly khác
· Chỉ định tập các quyền hạn để assembly chạy đúng.

Những thông tin này được dùng trong thời gian chạy để giải quyết các tham chiếu, tuân thủ chính sách kết nối phiên bản, công nhận tính toàn vẹn của assembly được nạp. Môi trường thực thi có thể phát hiện và định vị assembly cho bất kỳ đối tượng đang thực thi nào, do mọi kiểu được nạp trong ngữ cảnh của một assembly. Các assembly cũng có thể là đơn vị với code truy xuất bảo mật được áp dụng. Dấu hiệu đặc trưng cho mỗi assembly được xem xét một cách riêng biệt dựa trên mã của nó.

Thế nào là private assembly và shared assembly?
Một private assembly chỉ được dùng bởi một ứng dụng riêng lẻ, và nó được chứa trong thư mục cài đặt của ứng dụng đó. Shared assembly là một assembly có thể được tham chiếu bởi nhiều hơn một ứng dụng. Để chia sẻ một assembly, assembly đó phải được gán một tên được mã hóa đối với tất cả các ứng dụng có tham chiếu đến nó, hay còn gọi là tên dùng chung (shared name). Ngược lại một private chỉ cần có tên duy nhất đối với ứng dụng chứa nó.
Bằng cách phân biệt giữa private assembly và shared assembly, chúng ta giới thiệu khái niệm chia sẻ (sharing) như là một quyết định rõ ràng. Đơn giản chỉ cần đặt các private assembly vào trong một thư mục của một ứng dụng bạn có thể bảo đảm rằng ứng dụng đó sẽ chỉ chạy độc lập, không tham chiếu đến bất cứ thứ gì ngoài mã lệnh của riêng nó. Các tham chiếu đến private assembly chỉ được giải quyết bên trong thư mục riêng của ứng dụng đó. Có nhiều lý do để bạn chọn dùng một shared assembly. Shared assembly phải có tên được mã hóa để bảo đảm chỉ có tác giả của assembly đó mới có khóa để phát triển một phiên bản mới của assembly đó. Do đó nếu bạn chấp nhận một phiên bản cập nhật của một assembly thì bạn cũng cần biết rằng nó luôn được điều khiển và thẩm tra bởi tác giả của nó.
Đối với những ứng dụng được cài đặt một cách cục bộ, một shared assembly thường được cài đặt bên trong bộ đệm assembly toàn cục (globe assembly cache) được duy trì bởi .NET Framework. Điểm chính của tính năng quản lý phiên bản là để bảo đảm mã được download không ảnh hưởng đến việc thực thi của một ứng dụng được cài đặt cục bộ. Mã được download được chứa trong một bộ đệm download đặc biệt và không mang tính toàn cục đối với hệ thống cho đến khi có một thành phần download được xây dựng như là một shared assembly.
Các lớp phân phối cùng với .NET Framework là shared assembly.

Đâu là điểm khác biệt giữa namespace và assembly name?

Một namespace là một sự phối hợp tên luận lý giữa các kiểu trong đó một tên đơn giản, ví dụ MyType, được đi đầu bởi một tên có cấu trúc phân cấp ngăn cách bởi dấu “.” . Một sự phối hợp tên như thế hoàn toàn nằm trong sự kiểm soát của nhà phát triển. Ví dụ, kiểu MyCompany.FileAccess.A và MyCompany.FileAccess.B có thể được hiểu là có chức năng liên quan đến truy xuất file. .NET Framework dùng sự phối hợp tên phân cấp để
phân nhóm các kiểu vào trong các nhóm luận lý có chức năng liên quan với nhau. Các công cụ thiết kế có thể dùng namespacce giúp nhà phát triển dễ dàng tham chiếu đến các kiểu trong mã lệnh của họ. Một assembly có thể chứa nhiều kiểu mà các tên kế thừa có gốc namespace khác nhau, và một namespace luận lý có thể bao hàm nhiều assembly. Trong .NET Framework một namespace là một cách đặt tên trong lúc thiết kế để có thể làm việc tiện lợi hơn, trong khi tầm vực của tên kiểu được thiết lập trong thời gian thực thi.


Tôi đã viết xong một assembly và tôi muốn dùng nó trong nhiều ứng dụng, vậy tôi phải đặt nó ở đâu?
Các assembly được dùng bởi nhiều ứng dụng được đặt trong bộ đệm assembly tổng thể. Phiên bản mới của Windows Installer có thể dùng để cài đặt assembly trong bộ đệm.

Làm thế nào để xem các assembly được cài đặt trong bộ đệm?
Bạn có thể tìm trong thư mục Windir\assembly, trong đó windir\ là thư mục cài đặt Windows của bạn.

Miền ứng dụng (application domain) là gì?


Một miền ứng dụng (thường gọi AppDomain) và một tiến trình ảo phục vụ cho một ứng dụng đơn lẻ. Tất cả các đối tượng tạo bên trong một ứng dụng được tạo ra trong cùng một miền ứng dụng. Nhiều miền ứng dụng có thể tồn tại trong một tiến trình đơn của hệ điều hành.
Một tiến trình của hệ điều hành tạo ra sự cách ly bằng cách có một không gian địa chỉ nhớ riêng biệt. Điều này làm hao tốn tài nguyên hệ thống, đặc biệt là với những hệ thống lớn như một Web server. Common Language Runtime đảm bảo tính cách ly giữa các ứng dụng bằng cách quản lý bộ nhớ dùng bởi mã lệnh đang chạy trong miền ứng dụng. Điều này bảo đảm không có truy xuất bộ nhớ xảy ra bên ngoài miền ứng dụng. Cần chú ý rằng chỉ có mã an toàn kiểu (type - safe code) mới được quản lý bằng cách này. Môi trường thực thi không thể bảo đảm tính cách ly khi mã không an toàn kiểu được nạp trong một miền ứng dụng .

Garbage collection là gì?


Garbage collection là một cơ chế cho phép máy tính phát hiện khi nào một đối tượng không còn được truy xuất nữa. Khi đó nó sẽ giải phóng bộ nhớ dùng bởi đối tượng đó. Trình thực hiện chức năng này gọi là trình garbage collector. Một số trình garbage collector khác nén bộ nhớ và do đó làm giảm không gian của chương trình trong bộ nhớ.

Làm thế nào mà garbage collector bất định ảnh hưởng đến mã lệnh của tôi?
Đối với hầu hết lập trình viên, có một trình garbage collector nghĩa là bạn không bao giờ phải quan tâm đến vấn đề giải phóng bộ nhớ, hay vấn đề đếm tham chiếu đến đối tượng, ngay cả khi bạn dùng các cấu trúc dữ liệu phức tạp. Tuy nhiên, điều này đòi hỏi một số thay đổi trong phong cách lập trình nếu bạn giải phóng tài nguyên hệ thống trong cùng một khối mã giải phóng cho bộ nhớ cho một đối tượng. Với một đối tượng garbage collected bạn cần cung cấp một phương pháp giải phóng tài nguyên hệ thống một cách xác định và để cho garbage collector giải phóng bộ nhớ.

Tôi có thể dùng đối tượng COM trong một chương trình .NET Framework không?

Có. Bất cứ thành phần COM nào bạn có đều có thể được dùng trong managed code, và thường thì chúng sẽ tự động thích nghi. Một cách chính xác, các thành phần COM được truy xuất từ .NET Framework bằng cách dùng một wrapper có thể gọi trong thời gian chạy. Wrapper này chuyển giao diện COM vào trong giao diện tương thích của .NET Framework. Đối với giao diện OLE Automation, RCW có thể được tạo ra một cách tự động. Đối với các giao diện non – OLE Automation, một nhà phát triển có thể viết một RCW cho nó.
Các thành phần .NET Framework có thể được dùng trong một chương trình COM hay Các kiểu được quản lý (managed type) bạn tạo ngày nay có thể được truy xuất từ COM, và thường thì việc cấu hình là tự động. Có vài tính năng mới của môi trường phát triển được quản lý (managed development enviroment) không thể truy xuất được từ COM. Ví dụ như các phương thức tĩnh và các contructor có tham số. Về tổng thể, nếu làm cho kiểu có thể được truy xuất trong COM thì bạn sẽ bị giới hạn phải dùng các chức năng mà COM có thể truy xuất được.

Các thành phần của .NET Framework được truy xuất từ COM dùng một wrapper COM có thể gọi được (COM callable wrapper). Nó cũng giống như RCW nhưng làm việc theo hướng ngược lại. không?

Các kiểu được quản lý (managed type) bạn tạo ngày nay có thể được truy xuất từ COM, và thường thì việc cấu hình là tự động. Có vài tính năng mới của môi trường phát triển được quản lý (managed development enviroment) không thể truy xuất được từ COM. Ví dụ như các phương thức tĩnh và các contructor có tham số. Về tổng thể, nếu làm cho kiểu có thể được truy xuất trong COM thì bạn sẽ bị giới hạn phải dùng các chức năng mà COM có thể truy xuất được. Các thành phần của .NET Framework được truy xuất từ COM dùng một wrapper COM có thể gọi được (COM callable wrapper). Nó cũng giống như RCW nhưng làm việc theo hướng ngược lại.

Nhận xét

Bài đăng phổ biến từ blog này

Vẽ UML trong Visual Studio 2015

I. Giới thiệu       Hiện nay có rất nhiều công cụ để mô hình hóa trong đó có UML với các công cụ như: PowerDesigner, Visio, Draw.io,... Nhưng các công cụ này đều phải có bản quyền và hơn hết phải cài đặt thêm khá nặng máy. Ít ai biết đến bộ công cụ vẽ UML có sẵn trong Visual Studio. Vì dân IT hầu như ai cũng có sử dụng nó và hiện giờ đã có bản Visual Studio Community miễn phí cho tất cả các lập trình viên. Vậy chúng ta sẽ tìm hiểu cách vẽ UML trong Visual Studio nhé.

SmartGIT

Hướng dẫn cài đặt GIT Nói chung  Team Foundation Server  trong Visual Studio khá tốt và có nhiều tính năng hay. Nhưng lại giới hạn người dùng. Nếu team bạn nhiều hơn 5 người thì có thể xài GIT vậy. Được cái tất cả là Free.