Mã được quản lý hoặc không được quản lý trong lập trình là gì?


150

Tôi đang sử dụng một lệnh cụ thể trong mã C # của mình, hoạt động tốt. Tuy nhiên, nó được cho là hoạt động sai trong mã "không được quản lý".

Mã được quản lý hoặc không được quản lý là gì?


Câu trả lời:


75

Đây là một số văn bản từ MSDN về mã không được quản lý .

Một số mã thư viện cần gọi vào mã không được quản lý (ví dụ: API mã gốc, chẳng hạn như Win32). Bởi vì điều này có nghĩa là đi ra ngoài vành đai bảo mật cho mã được quản lý, do đó cần phải thận trọng.

Dưới đây là một số giải thích miễn phí khác về Mã được quản lý:

  • Mã được thực thi bởi CLR.
  • Mã nhắm vào thời gian chạy ngôn ngữ chung, nền tảng của .NET Framework, được gọi là mã được quản lý.
  • Mã được quản lý cung cấp siêu dữ liệu cần thiết cho CLR để cung cấp các dịch vụ như quản lý bộ nhớ, tích hợp ngôn ngữ chéo, bảo mật truy cập mã và kiểm soát tự động suốt đời của các đối tượng. Tất cả các mã dựa trên IL thực thi như mã được quản lý.
  • Mã thực thi trong môi trường thực thi CLI.

Đối với vấn đề của bạn:

Tôi nghĩ đó là vì NUnit thực thi mã của bạn cho UnitTesting và có thể có một số phần không được quản lý. Nhưng tôi không chắc về điều đó, vì vậy đừng lấy thứ này để lấy vàng. Tôi chắc chắn ai đó sẽ có thể cung cấp cho bạn thêm thông tin về nó. Hy vọng nó giúp!


12
Tôi đánh giá cao những nỗ lực đi vào câu trả lời của bạn. nhưng những người không biết "mã được quản lý" sẽ đấu tranh với ý nghĩa của bạn trong câu trả lời của bạn: họ sẽ không biết: "mã thư viện", "mã không được quản lý", "API mã gốc", CLR, nền tảng của khung .net, IL, môi trường thực thi CLI, v.v.
BKSpurgeon 3/03/2016

200

Đây là một bài viết tốt về chủ đề này.

Tóm lại,

  1. Mã được quản lý không được biên dịch thành mã máy mà là ngôn ngữ trung gian được dịch vụ và thực thi bởi một số dịch vụ trên máy và do đó hoạt động trong khuôn khổ bảo mật (hy vọng!) Xử lý những thứ nguy hiểm như bộ nhớ và luồng cho bạn. Trong sử dụng hiện đại, điều này thường có nghĩa là .NET nhưng không phải.

Một chương trình ứng dụng được thực thi trong một công cụ thời gian chạy được cài đặt trong cùng một máy. Ứng dụng không thể chạy mà không có nó. Môi trường thời gian chạy cung cấp thư viện chung về các thói quen phần mềm mà chương trình sử dụng và thường thực hiện quản lý bộ nhớ. Nó cũng có thể cung cấp chuyển đổi chỉ trong thời gian (JIT) từ mã nguồn sang mã thực thi hoặc từ ngôn ngữ trung gian sang mã thực thi. Thời gian chạy ngôn ngữ chung (CLR) của Java, Visual Basic và .NET là các ví dụ về các công cụ thời gian chạy. ( Đọc thêm )

  1. Mã không được quản lý được biên dịch thành mã máy và do đó được thực thi trực tiếp bởi HĐH. Do đó, nó có khả năng thực hiện những điều gây tổn hại / mạnh mẽ Mã được quản lý không có. Đây là cách mọi thứ được sử dụng để làm việc, vì vậy, thông thường nó được liên kết với các công cụ cũ như.

Một chương trình thực thi chạy bởi chính nó. Ra mắt từ hệ điều hành, chương trình gọi và sử dụng các thói quen phần mềm trong hệ điều hành, nhưng không yêu cầu sử dụng hệ thống phần mềm khác. Các chương trình ngôn ngữ hội đã được lắp ráp thành ngôn ngữ máy và các chương trình C / C ++ được biên dịch thành ngôn ngữ máy cho một nền tảng cụ thể là các ví dụ về mã không được quản lý. ( Đọc thêm )

  1. Native code đang thường đồng nghĩa với Switch, nhưng không phải là giống hệt nhau.

ý bạn là trong việc hack chúng ta không thể sử dụng ngôn ngữ .net (C #, C ++), phải không?
Haroon A.

7
@H_wardak bạn định nghĩa thế nào là 'hack'? đó là một thuật ngữ rất chung chung, nó giống như nói rằng hack vào NORAD và hack một số thanh ghi là như nhau.
Alex

7
Tôi đã từng được người phỏng vấn hỏi, chúng ta có thể chạy / viết mã không được quản lý trong C # không? bất cứ ai có thể giúp đỡ về điều này?
RSB

9
@RSB: Bạn không thể viết mã không được quản lý trong C # (mặc dù, bạn có thể gọi trực tiếp mã không được quản lý từ C #). Về mặt lý thuyết, với trình biên dịch và khung đúng, bạn có thể làm điều đó, tôi đoán vậy. Trong thực tế, điều đó có nghĩa là bạn cần một trình biên dịch có thể biên dịch C # thành mã máy trực tiếp. Không chắc làm thế nào sẽ làm việc.
James Haug

67

Khi bạn nghĩ về việc không được quản lý , hãy nghĩ mã cấp độ máy cụ thể. Giống như ngôn ngữ lắp ráp x86. Mã không được quản lý (nguyên gốc) được biên dịch và liên kết để chạy trực tiếp trên bộ xử lý mà nó được thiết kế, không bao gồm tất cả các công cụ hệ điều hành trong thời điểm này. Nó không phải là di động, nhưng nó là nhanh chóng. Rất đơn giản, tước mã.

được quản lý là mọi thứ từ Java đến BASIC cũ, hoặc bất cứ thứ gì chạy trong .NET. Mã được quản lý thường được biên dịch thành tập lệnh P-Code hoặc mã byte cấp trung gian. Đây không phải là hướng dẫn cụ thể của máy, mặc dù chúng trông giống với ngôn ngữ lắp ráp. Mã được quản lý cách ly chương trình với máy đang chạy và tạo ranh giới an toàn trong đó tất cả bộ nhớ được phân bổ gián tiếp và nói chung, bạn không có quyền truy cập trực tiếp vào tài nguyên máy như cổng, không gian địa chỉ bộ nhớ, ngăn xếp, v.v. Ý tưởng là để chạy trong một môi trường an toàn hơn.

Để chuyển đổi từ một biến được quản lý, giả sử, thành một biến không được quản lý, bạn phải đến chính đối tượng thực tế. Nó có thể được bọc hoặc đóng hộp trong một số bao bì bổ sung. Các biến không được quản lý (như 'int', giả sử) - trên máy 32 bit - mất chính xác 4 byte. Không có chi phí hoặc bao bì bổ sung. Quá trình chuyển từ mã được quản lý sang mã không được quản lý - và quay lại - được gọi là " marshẩy ". Nó cho phép các chương trình của bạn vượt qua ranh giới.


1
Làm thế nào sau đó mashalling tương tác với các loại giá trị và tham chiếu? Tôi nhớ đã thấy một cái gì đó về MarshalByRefObject, ví dụ.
Kyle Baran

24

Trong càng ít từ càng tốt:

  • mã được quản lý = chương trình .NET
  • mã không được quản lý = chương trình "bình thường"

16
một chương trình .NET không "bình thường"?
jtate

1
@jtate - Điều đó làm giảm nó xuống một chút, vâng. :) Tôi đã cố gắng để làm cho nó trực quan hơn. Dù sao, đó là hơn 8 năm trước. Ngày nay với vô số ngôn ngữ lập trình được sử dụng phổ biến hàng ngày, sự khác biệt này thực sự thậm chí còn thiếu chính xác hơn, vâng.
Vilx-

5

được quản lý là những gì trình biên dịch C # .Net, VB.Net, F # .Net vv tạo ra. Nó chạy trên CLR, trong số những thứ khác cung cấp các dịch vụ như thu gom rác và kiểm tra tham chiếu, và nhiều hơn nữa. Vì vậy, hãy nghĩ về nó như là, mã của tôi được quản lý bởi CLR.

Mặt khác, mã không được quản lý biên dịch thẳng vào mã máy. Nó không được quản lý bởi CLR.


4

Về cơ bản mã không được quản lý là mã không chạy dưới .NET CLR (còn gọi là VB.NET, C #, v.v.). Tôi đoán là NUnit có một trình chạy / trình bao bọc không phải là mã .NET (hay còn gọi là C ++).


4

Mã được quản lý:
Mã chạy theo "hợp đồng hợp tác" với thời gian chạy ngôn ngữ chung. Mã được quản lý phải cung cấp siêu dữ liệu cần thiết cho thời gian chạy để cung cấp các dịch vụ như quản lý bộ nhớ, tích hợp ngôn ngữ chéo, bảo mật truy cập mã và kiểm soát tự động suốt đời của các đối tượng. Tất cả mã dựa trên ngôn ngữ trung gian của Microsoft (MSIL) thực thi dưới dạng mã được quản lý.

Mã không được quản lý:
Mã được tạo mà không liên quan đến các quy ước và yêu cầu của thời gian chạy ngôn ngữ chung. Mã không được quản lý thực thi trong môi trường thời gian chạy ngôn ngữ chung với các dịch vụ tối thiểu (ví dụ: không có bộ sưu tập rác, gỡ lỗi giới hạn, v.v.).

Tham khảo: http://www.dotnetspider.com/forum/11612-difference-b between-managed-and-unmanaged-code.aspx


3

NUnit tải các bài kiểm tra đơn vị trong một AppDomain riêng biệt và tôi cho rằng điểm vào không được gọi (có thể không cần thiết), do đó, mục nhập là null.


2

Mã được quản lý chạy bên trong môi trường của CLR tức là .NET runtime. Tóm lại, tất cả IL đều là mã được quản lý. Nhưng nếu bạn đang sử dụng một số phần mềm bên thứ ba, ví dụ VB6 hoặc VC ++, chúng không phải là mã được quản lý vì .NET runtime (CLR) không có quyền kiểm soát qua việc thực thi mã nguồn của ngôn ngữ.


1

Mã được quản lý: - Mã mà MSIL (ngôn ngữ trung gian) được phát triển sau khi biên dịch trình biên dịch ngôn ngữ và được thực thi trực tiếp bằng CLRmã được quản lý. ví dụ: - Tất cả 61 mã ngôn ngữ được hỗ trợ bởi khung .net

Mã không được quản lý: - mã được phát triển trước .netđó mà mẫu MSIL không có sẵn và nó được thực thi CLRtrực tiếp thay vì CLRsẽ chuyển hướng đến hệ điều hành, đây được gọi là mã không được quản lý.

ví dụ: -COM, API Win32


Có một số sai lầm trong bài này. Rõ ràng nhất là MISL (ý bạn là MSIL).
Matt Seymour

1
  • quản lý : mã được viết bằng ngôn ngữ .NET như C #, VB.NET.
  • Switch Code: mã không viết bằng ngôn ngữ .NET và MSIL không hiểu nó là cái gì và không thể chạy theo CLR; như các điều khiển của bên thứ ba mà chúng tôi đã sử dụng trong các ứng dụng .NET không được tạo bằng ngôn ngữ .NET.

0

Trước hết hãy hiểu điều này, trước đây .NET framework, Microsoftlà cung cấp các sản phẩm độc lập như MFC (Visual C++), VB, FoxProv.v.

Năm 2002, Microsoft đã kết hợp các sản phẩm của mình và tạo ra .NET framework. Bây giờ có một sự khác biệt giữa cách mã được thực thi trước đó và cách mã được quản lý và thực thi trong .NET framework. Microsoft đã giới thiệu khái niệm về CLR.NET framework để biên dịch mã đến từ bất kỳ làn đường được hỗ trợ nào của .NET framework và cung cấp các chức năng bổ sung như, memory mangement, garbage collectionv.v. Nhưng, các tính năng CLR như vậy không có sẵn trực tiếp trước đó.

Vì vậy, nếu bạn đang tạo thư viện / mã trong .NET framework (được biên dịch bằng CLR) thì nó được gọi Managed code. Bạn có thể sử dụng thư viện này hơn nữa trong ứng dụng / dự án .NET khác và ở đó, CLR sẽ hiểu cách nó được biên dịch trước đó và đó là lý do tại sao nó vẫn là mã quản lý của bạn.

OTOH nếu bạn muốn sử dụng các thư viện được viết trước .NET framework thì bạn có thể thực hiện với một số hạn chế nhất định, nhưng hãy nhớ, vì CLR không có ở đó vào thời điểm đó, vì vậy bây giờ, CLR sẽ không hiểu và biên dịch lại mã này . Và điều này sẽ được gọi unmanaged code. Xin lưu ý rằng, các thư viện / giả định được tạo bởi một số bên thứ ba để cung cấp các tính năng / công cụ nhất định cũng có thể được coi là mã không quản lý nếu không phải là CLR compatiblie.

Theo thuật ngữ laymen, Quản lý mã là thứ mà CLR của bạn hiểu và có thể tự biên dịch mã để thực hiện thêm. Trong .NET framework, (từ bất kỳ ngôn ngữ nào hoạt động trên .NET framework) Khi mã đi đến CLR thì mã cung cấp một số thông tin dữ liệu meta, để CLR có thể cung cấp cho bạn các tính năng được chỉ định ở đây . Vài người trong số họ là Garbage collection, Performance improvements, cross-language integration, memory managementvv

OTOH, mã không thay đổi là một cái gì đó cụ thể cho máy và sẵn sàng để sử dụng, không cần phải xử lý thêm.


Rất nhiều, rất nhiều và rất nhiều ý kiến ​​không hiểu, tôi sợ. Điều này có thể gây ngạc nhiên, nhưng CLR cũng có thể thực thi mã không được quản lý (thường được viết bằng C ++ / CLI). Cũng không có yêu cầu cho mã được quản lý có sẵn như IL. .NET Native đã xuất hiện được một thời gian và nó đi kèm với các hội đồng được biên dịch sẵn. Cái mà bạn gọi là "tương thích CLR" có thể có nghĩa là "tuân thủ CLS" . Việc không đáp ứng tuân thủ CLS không làm cho mã được quản lý không được quản lý, đột nhiên. Sử dụng mã không được quản lý - mặc dù mô tả của bạn - cũng khá dễ dàng (RCW qua COM, P / Gọi, C ++ / CLI, v.v.).
Không thể phát hiện

0

Từ Pro C # 5 và .NET 4.5 Framework:

Mã được quản lý so với mã không được quản lý: Có lẽ điểm quan trọng nhất để hiểu về ngôn ngữ C # là nó có thể tạo mã chỉ có thể thực thi trong thời gian chạy .NET (bạn không bao giờ có thể sử dụng C # để xây dựng máy chủ COM gốc hoặc C / C ++ không được quản lý ứng dụng). Nói một cách chính thức, thuật ngữ được sử dụng để mô tả mã nhắm mục tiêu thời gian chạy .NET là mã được quản lý. Đơn vị nhị phân có chứa mã được quản lý được gọi là một hội đồng (chi tiết hơn về các hội đồng chỉ trong một chút). Ngược lại, mã không thể được lưu trữ trực tiếp bởi thời gian chạy .NET được gọi là mã không được quản lý.

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.