簡體   English   中英

編程中的托管代碼或非托管代碼是什么?

[英]What is managed or unmanaged code in programming?

我在我的C#代碼中使用了一個特定的命令,它運行良好。 但是,據說它在“非托管”代碼中行為不端。

什么是托管代碼或非托管代碼?

是一篇關於這個主題的好文章。

總結一下,

  1. 托管代碼不是編譯為機器代碼,而是編譯為中間語言,由機器上的某些服務解釋和執行,因此在一個(希望是!)安全框架內運行,該框架為您處理內存和線程等危險事物。 在現代用法中,這通常意味着.NET,但並非如此。

在安裝在同一台機器中的運行時引擎中執行的應用程序。 沒有它,應用程序無法運行。 運行時環境提供程序使用的通用軟件程序庫,通常執行內存管理。 它還可以提供從源代碼到可執行代碼或從中間語言到可執行代碼的即時(JIT)轉換。 Java,Visual Basic和.NET的公共語言運行時(CLR)是運行時引擎的示例。 了解更多

  1. 非托管代碼被編譯為機器代碼,因此直接由OS執行。 因此,它有能力做破壞/強大的事情托管代碼沒有。 這就是所有東西用來工作的方式,所以通常它與像.dll這樣的舊東西相關聯。

一個可執行的程序,它自己運行。 程序從操作系統啟動,調用並使用操作系統中的軟件例程,但不需要使用其他軟件系統。 已組裝成機器語言的匯編語言程序和編譯為特定平台的機器語言的C / C ++程序是非托管代碼的示例。( 閱讀更多

  1. 本機代碼通常與Unmanaged同義,但不完全相同。

以下是MSDN中有關非托管代碼的一些文本。

某些庫代碼需要調用非托管代碼(例如,本機代碼API,如Win32)。 因為這意味着要超出托管代碼的安全范圍,所以需要謹慎。

以下是關於托管代碼的其他一些免費解釋:

  • 由CLR執行的代碼。
  • 針對公共語言運行庫(.NET Framework的基礎)的代碼稱為托管代碼。
  • 托管代碼提供CLR所需的元數據,以提供諸如內存管理,跨語言集成,代碼訪問安全性和對象的自動生命周期控制等服務。 基於IL的所有代碼都作為托管代碼執行。
  • 在CLI執行環境下執行的代碼。

對於你的問題:

我認為這是因為NUnit執行UnitTesting的代碼,並且可能有一部分是非托管的。 但我不確定,所以不要把它當作黃金。 我相信有人能夠為您提供更多相關信息。 希望能幫助到你!

當您想到非托管時 ,請考慮特定於機器的機器級代碼。 像x86匯編語言一樣。 非托管(本機)代碼經過編譯和鏈接,可直接在其設計的處理器上運行,目前不包括所有操作系統內容。 它不便攜,但速度很快。 非常簡單,精簡代碼。

托管代碼是從Java到舊的Interpretive BASIC,或者在.NET下運行的任何東西。 托管代碼通常被編譯為中間級別的P-Code或字節代碼指令集。 這些不是特定於機器的指令,盡管它們看起來類似於匯編語言。 托管代碼使程序與其運行的機器隔離,並創建一個安全邊界,其中所有內存都是間接分配的,一般來說,您無法直接訪問機器資源,如端口,內存地址空間,堆棧等這個想法是在更安全的環境中運行。

要從托管變量轉換為非托管變量,您必須轉到實際對象本身。 它可能包裝或裝在一些額外的包裝中。 在32位機器上的非托管變量(比如說'int') - 只需要4個字節。 沒有開銷或額外的包裝。 從托管代碼轉到非托管代碼的過程 - 再回來 - 稱為“ 編組 ”。 它允許您的程序跨越邊界。

用盡可能少的詞語:

  • 托管代碼= .NET程序
  • 非托管代碼=“正常”程序

托管代碼:
在與公共語言運行時的“合作合同”下運行的代碼。 托管代碼必須提供運行時所需的元數據,以提供諸如內存管理,跨語言集成,代碼訪問安全性和對象的自動生命周期控制等服務。 所有基於Microsoft中間語言(MSIL)的代碼都作為托管代碼執行。

未管理的代碼:
創建的代碼不考慮公共語言運行庫的約定和要求。 非托管代碼在公共語言運行時環境中以最少的服務執行(例如,沒有垃圾收集,有限的調試等)。

參考: http//www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx

基本上非托管代碼是不在.NET CLR下運行的代碼(又名不是VB.NET,C#等)。 我的猜測是NUnit有一個不是.NET代碼(又名C ++)的運行器/包裝器。

NUnit在單獨的AppDomain中加載單元測試,我假設沒有調用入口點(可能不需要),因此入口程序集為null。

托管代碼在CLR環境中運行,即.NET運行時。簡而言之,所有IL都是托管代碼。但是如果使用某些第三方軟件示例VB6或VC ++組件,則它們是非托管代碼,因為.NET運行時(CLR)無法控制在源代碼執行語言。

托管代碼是C#.Net,VB.Net,F#.Net等編譯器創建的代碼。 它運行在CLR上,其中包括垃圾收集和引用檢查等服務。 所以把它想象成,我的代碼由CLR管理。

另一方面, 非托管代碼直接編譯為機器代碼。 它不由CLR管理。

托管代碼: - 在語言編譯器編譯之后開發的MSIL(中間語言)表單的代碼,由CLR直接執行,稱為托管代碼。 例如: - .net框架支持的所有61種語言代碼

非托管代碼: - 在.net之前開發的代碼,其MSIL表單不可用,它由CLR直接執行,而CLR將重定向到操作系統,這稱為非托管代碼。

例如:-COM,Win32 API

  • 托管代碼:用.NET語言編寫的代碼,如C#,VB.NET。
  • UnManaged Code:代碼不是用.NET語言編寫的,MSIL不理解它是什么,不能在CLR下運行; 就像我們在.NET應用程序中使用的第三方控件一樣,它不是用.NET語言創建的。

首先要了解這一點,在.NET framework之前, Microsoft提供了獨立的產品,如MFC (Visual C++), VB, FoxPro等。

2002年,微軟將其產品結合起來並制作了.NET框架。 現在,在.NET框架中如何執行代碼以及如何管理和執行代碼之間存在差異。 Microsoft引入了帶有.NET框架的CLR概念,它編譯來自任何受支持的.NET框架的代碼,並提供其他功能,如memory mangement, garbage collection等。但是,此類CLR功能以前無法直接使用。

因此,如果您在.NET框架中創建庫/代碼(使用CLR編譯),則稱為Managed code 您可以在其他.NET應用程序/項目中進一步使用此庫,CLR也會理解它之前是如何編譯的,這就是它仍然是您的管理代碼的原因。

OTOH如果你想使用在.NET框架之前編寫的庫然后你可以做某些限制,但請記住,因為當時CLR不存在,所以現在,CLR將無法理解並再次編譯此代碼。 這將被稱為unmanaged code 請注意,如果不是CLR兼容,由某些第三方創建的用於提供某些功能/工具的庫/組件也可以被視為非管理代碼。

在外行人看來, 管理代碼是您的CLR理解的東西,可以自己編譯以便進一步執行。 在.NET框架中,(來自任何使用.NET框架的語言)當代碼轉到CLR時,代碼會提供一些元數據信息,以便CLR可以為您提供此處指定的功能。 其中很少是Garbage collection, Performance improvements, cross-language integration, memory management等。

OTOH, 無人值守代碼是機器專用的東西,隨時可以使用,無需進一步處理。

從Pro C#5和.NET 4.5 Framework:

托管代碼與非托管代碼:理解C#語言最重要的一點是,它可以生成只能在.NET運行時內執行的代碼(您永遠不能使用C#來構建本機COM服務器或非托管C / C ++應用)。 從官方上講,用於描述面向.NET運行時的代碼的術語是托管代碼。 包含托管代碼的二進制單元稱為程序集(有關程序集的更多詳細信息)。 相反,.NET運行時無法直接托管的代碼稱為非托管代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM