Apa kode yang dikelola atau tidak dikelola dalam pemrograman?


150

Saya menggunakan perintah khusus di dalam kode C # saya, yang berfungsi dengan baik. Namun, konon kelakuan buruk dalam kode "tidak dikelola".

Apa kode yang dikelola atau tidak dikelola?


Jawaban:


75

Berikut adalah beberapa teks dari MSDN tentang kode yang tidak dikelola .

Beberapa kode perpustakaan perlu memanggil kode yang tidak dikelola (misalnya, API kode asli, seperti Win32). Karena ini berarti keluar dari perimeter keamanan untuk kode terkelola, diperlukan kehati-hatian.

Berikut adalah beberapa penjelasan gratis lainnya tentang kode Terkelola:

  • Kode yang dijalankan oleh CLR.
  • Kode yang menargetkan runtime bahasa umum, fondasi .NET Framework, dikenal sebagai kode terkelola.
  • Kode terkelola memasok metadata yang diperlukan untuk CLR untuk menyediakan layanan seperti manajemen memori, integrasi lintas bahasa, keamanan akses kode, dan kontrol objek seumur hidup secara otomatis. Semua kode berdasarkan IL dijalankan sebagai kode terkelola.
  • Kode yang dijalankan di bawah lingkungan eksekusi CLI.

Untuk masalah Anda:

Saya pikir itu karena NUnit mengeksekusi kode Anda untuk UnitTesting dan mungkin memiliki beberapa bagian yang tidak dikelola. Tapi saya tidak yakin tentang itu, jadi jangan mengambil ini untuk emas. Saya yakin seseorang akan dapat memberi Anda lebih banyak informasi tentang itu. Semoga ini bisa membantu!


12
Saya menghargai upaya menjawab pertanyaan Anda. tetapi orang-orang yang tidak tahu apa "kode terkelola" akan berjuang dengan apa yang Anda maksud dalam jawaban Anda: mereka tidak akan tahu: "kode perpustakaan", "kode tidak dikelola", "API kode asli", CLR, dasar kerangka kerja .net, IL, lingkungan eksekusi CLI, dll.
BKSpurgeon

200

Ini adalah artikel yang bagus tentang topik ini.

Untuk meringkas,

  1. Kode terkelola tidak dikompilasi ke kode mesin tetapi ke bahasa perantara yang ditafsirkan dan dieksekusi oleh beberapa layanan pada mesin dan karena itu beroperasi dalam kerangka kerja (mudah-mudahan!) Aman yang menangani hal-hal berbahaya seperti memori dan utas untuk Anda. Dalam penggunaan modern ini sering berarti .NET tetapi tidak harus.

Program aplikasi yang dijalankan di dalam mesin runtime yang dipasang di mesin yang sama. Aplikasi tidak dapat berjalan tanpanya. Lingkungan runtime menyediakan perpustakaan umum rutin perangkat lunak yang digunakan oleh program dan biasanya melakukan manajemen memori. Ini juga dapat memberikan konversi tepat waktu (JIT) dari kode sumber ke kode yang dapat dieksekusi atau dari bahasa perantara ke kode yang dapat dieksekusi. Java, Visual Basic dan .NET's Common Language Runtime (CLR) adalah contoh mesin runtime. ( Baca lebih lanjut )

  1. Kode yang tidak dikelola dikompilasi ke kode mesin dan oleh karena itu dijalankan oleh OS secara langsung. Karena itu ia memiliki kemampuan untuk melakukan hal-hal yang merusak / kuat. Kode Managed tidak. Ini adalah bagaimana semuanya digunakan untuk bekerja, jadi biasanya ini terkait dengan hal-hal lama seperti .dlls.

Program yang dapat dieksekusi yang berjalan dengan sendirinya. Diluncurkan dari sistem operasi, program memanggil dan menggunakan rutin perangkat lunak dalam sistem operasi, tetapi tidak memerlukan sistem perangkat lunak lain untuk digunakan. Program bahasa assembly yang telah dirakit menjadi bahasa mesin dan program C / C ++ yang dikompilasi ke dalam bahasa mesin untuk platform tertentu adalah contoh kode yang tidak dikelola. ( Baca lebih lanjut )

  1. Kode asli sering identik dengan Unmanaged, tetapi tidak identik.

maksud Anda dalam peretasan, kita tidak bisa menggunakan .net langauge (C #, C ++), kan?
Haroon A.

7
@H_wardak apa yang Anda definisikan sebagai 'peretasan'? ini istilah yang sangat umum, seperti mengatakan meretas NORAD dan meretas beberapa register adalah sama.
Alex

7
Saya pernah ditanya oleh pewawancara, bisakah kita menjalankan / menulis kode yang tidak dikelola dalam C #? Adakah yang bisa membantu dalam hal ini?
RSB

9
@RSB: Anda tidak dapat menulis kode yang tidak dikelola dalam C # (walaupun, Anda dapat langsung memanggil kode yang tidak dikelola dari C #). Secara teoritis, dengan kompiler dan kerangka kerja yang tepat, Anda bisa melakukannya, saya kira. Dalam praktiknya, itu berarti Anda memerlukan kompiler yang dapat mengkompilasi C # ke kode mesin secara langsung. Tidak yakin bagaimana itu akan berhasil.
James Haug

67

Ketika Anda memikirkan unmanaged , pikirkan kode tingkat mesin yang spesifik mesin. Seperti bahasa rakitan x86. Kode (asli) yang tidak dikelola dikompilasi dan ditautkan untuk dijalankan langsung pada prosesor yang dirancang untuknya, tidak termasuk semua hal OS untuk saat ini. Ini tidak portabel, tetapi cepat. Sangat sederhana, dilucuti kode.

Managed code adalah segalanya mulai dari Java hingga BASIC Interpretive lama, atau apa pun yang berjalan di bawah .NET. Kode yang dikelola biasanya dikompilasi ke instruksi kode-P atau kode byte tingkat menengah. Ini bukan instruksi khusus mesin, meskipun terlihat mirip dengan bahasa rakitan. Kode yang dikelola mengisolasi program dari mesin yang sedang berjalan, dan menciptakan batas aman di mana semua memori dialokasikan secara tidak langsung, dan secara umum, Anda tidak memiliki akses langsung ke sumber daya mesin seperti port, ruang alamat memori, tumpukan, dll. Idenya adalah untuk menjalankan dalam lingkungan yang lebih aman.

Untuk mengonversi dari variabel yang dikelola, katakanlah, ke variabel yang tidak dikelola, Anda harus membuka objek yang sebenarnya. Mungkin dibungkus atau dikemas dalam beberapa kemasan tambahan. Variabel yang tidak dikelola (seperti 'int', katakanlah) - pada mesin 32 bit - membutuhkan tepat 4 byte. Tidak ada overhead atau kemasan tambahan. Proses beralih dari dikelola ke kode yang tidak dikelola - dan kembali lagi - disebut " marshaling ". Ini memungkinkan program Anda untuk melewati batas.


1
Lalu bagaimana mashalling berinteraksi dengan tipe nilai dan referensi? Saya ingat melihat sesuatu tentang MarshalByRefObject, misalnya.
Kyle Baran

24

Dalam kata-kata sesedikit mungkin:

  • kode terkelola = .NET program
  • program kode = "normal" yang tidak dikelola

16
program .NET tidak "normal"?
jtate

1
@ Jtate - Itu sedikit menenggelamkannya, ya. :) Saya mencoba membuatnya lebih intuitif. Bagaimanapun, itu sudah lebih dari 8 tahun yang lalu sekarang. Saat ini dengan segudang bahasa pemrograman yang umum digunakan sehari-hari, perbedaan ini memang lebih tepat, ya.
Vilx-

5

Kode terkelola adalah apa yang dibuat oleh kompiler C # .Net, VB.Net, F # .Net dll. Ini berjalan pada CLR, yang antara lain menawarkan layanan seperti pengumpulan sampah, dan pengecekan referensi, dan banyak lagi. Jadi pikirkan sebagai, kode saya dikelola oleh CLR.

Di sisi lain, kode yang tidak dikelola mengkompilasi langsung ke kode mesin. Itu tidak dikelola oleh CLR.


4

Pada dasarnya kode yang tidak dikelola adalah kode yang tidak berjalan di bawah .NET CLR (alias bukan VB.NET, C #, dll.). Dugaan saya adalah bahwa NUnit memiliki pelari / pembungkus yang bukan .NET code (alias C ++).


4

Managed Code:
Kode yang berjalan di bawah "kontrak kerja sama" dengan runtime bahasa umum. Kode yang dikelola harus menyediakan metadata yang diperlukan untuk runtime untuk menyediakan layanan seperti manajemen memori, integrasi lintas bahasa, keamanan akses kode, dan kontrol objek seumur hidup secara otomatis. Semua kode berdasarkan Microsoft intermediate language (MSIL) dijalankan sebagai kode terkelola.

Un-Managed Code:
Kode yang dibuat tanpa memperhatikan konvensi dan persyaratan runtime bahasa umum. Kode yang tidak dikelola dijalankan dalam lingkungan runtime bahasa umum dengan layanan minimal (misalnya, tidak ada pengumpulan sampah, debugging terbatas, dan sebagainya).

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


3

NUnit memuat unit test dalam AppDomain yang terpisah, dan saya menganggap titik masuk tidak dipanggil (mungkin tidak diperlukan), oleh karena itu entri entri adalah nol.


2

Kode yang dikelola berjalan di dalam lingkungan CLR yaitu .NET runtime. Singkatnya semua IL adalah kode yang dikelola. Tetapi jika Anda menggunakan beberapa perangkat lunak pihak ketiga, misalnya komponen VB6 atau VC ++, kode-kode tersebut tidak dikelola sebagai kode. atas eksekusi kode sumber bahasa.


1

Managed Code: - Kode yang bentuk MSIL (bahasa perantara) dikembangkan setelah kompilasi bahasa dikompilasi dan langsung dieksekusi oleh CLRkode terkelola. misalnya: - Semua 61 kode bahasa yang didukung oleh .net framework

Unmanaged Code: - kode yang dikembangkan sebelumnya .netyang bentuk MSILnya tidak tersedia dan dijalankan CLRsecara langsung alih CLR- alih akan diarahkan ke sistem operasi, ini dikenal sebagai kode yang tidak dikelola.

misalnya: -COM, Win32 API


Ada sejumlah kesalahan dalam posting ini. Paling jelas MISL (maksud Anda MSIL).
Matt Seymour

1
  • Managed Code: kode yang ditulis dalam bahasa .NET seperti C #, VB.NET.
  • Kode Tidak Terkelola : kode tidak ditulis dalam bahasa .NET dan MSIL tidak mengerti apa itu dan tidak bisa berjalan di bawah CLR; seperti kontrol pihak ketiga yang kami gunakan dalam aplikasi .NET kami yang tidak dibuat dalam bahasa .NET.

0

Pertama-tama pahami ini, sebelumnya .NET framework, Microsoftmenyediakan produk yang berdiri sendiri seperti MFC (Visual C++), VB, FoxProdll.

Pada tahun 2002, Microsoft menggabungkan produknya dan membuat .NET framework. Sekarang ada perbedaan antara bagaimana kode dieksekusi sebelumnya dan bagaimana kode dikelola dan dieksekusi dalam .NET framework. Microsoft memperkenalkan konsep CLRdengan .NET framework yang mengkompilasi kode yang berasal dari bahasa yang didukung dari .NET framework dan menyediakan fungsionalitas tambahan seperti memory mangement, garbage collectiondll. Namun, fitur CLR tersebut tidak tersedia secara langsung sebelumnya.

Jadi jika Anda membuat perpustakaan / kode dalam .NET framework (dikompilasi dengan CLR) maka itu disebut Managed code. Anda dapat menggunakan pustaka ini lebih lanjut dalam aplikasi / proyek .NET lainnya, dan di sana juga, CLR akan mengerti bagaimana itu dikompilasi sebelumnya, dan itulah sebabnya ia tetap mengelola kode Anda.

OTOH jika Anda ingin menggunakan pustaka yang ditulis sebelum .NET framework maka Anda dapat melakukannya dengan batasan tertentu, tetapi ingat, karena CLR tidak ada di sana pada waktu itu, jadi sekarang, CLR tidak akan mengerti dan menyusun kode ini lagi . Dan ini akan disebut unmanaged code. Harap dicatat bahwa, pustaka / rakitan yang dibuat oleh beberapa pihak ketiga untuk menyediakan fitur / alat tertentu juga dapat dianggap sebagai kode tidak terkelola jika tidak sesuai dengan CLR.

Dalam istilah awam, Kelola kode adalah sesuatu yang dipahami CLR Anda dan dapat dikompilasinya sendiri untuk eksekusi lebih lanjut. Dalam .NET framework, (dari bahasa apa pun yang berfungsi pada .NET framework) Saat kode masuk ke CLR, kode menyediakan beberapa informasi meta data, sehingga CLR dapat memberikan Anda fitur yang ditentukan di sini . Beberapa dari mereka Garbage collection, Performance improvements, cross-language integration, memory managementdll.

OTOH, kode tanpa perubahan adalah sesuatu yang spesifik untuk mesin dan siap digunakan, tidak perlu diproses lebih lanjut.


Banyak dan banyak dan banyak pendapat yang kurang informasi, saya khawatir. Ini mungkin mengejutkan, tetapi CLR dapat mengeksekusi kode yang tidak dikelola (biasanya ditulis dalam C ++ / CLI) juga. Juga tidak ada persyaratan untuk kode terkelola tersedia sebagai IL. .NET Native telah ada untuk sementara waktu sekarang, dan ia datang dengan majelis pra-disusun. Apa yang Anda sebut "CLR kompatibel" mungkin dimaksudkan untuk "CLS compliant" . Kegagalan untuk memenuhi kepatuhan CLS tidak membuat kode terkelola tidak terkelola, tiba-tiba. Mengkonsumsi kode yang tidak dikelola - terlepas dari deskripsi Anda - juga cukup mudah (RCW lebih dari COM, P / Invoke, C ++ / CLI, dll.).
IInspectable

0

Dari Pro C # 5 dan .NET 4.5 Framework:

Managed vs. Unmanaged Code: Mungkin poin paling penting untuk memahami tentang bahasa C # adalah bahwa ia dapat menghasilkan kode yang hanya dapat dieksekusi dalam runtime .NET (Anda tidak pernah bisa menggunakan C # untuk membangun server COM asli atau C / C ++ yang tidak dikelola) aplikasi). Secara resmi, istilah yang digunakan untuk menggambarkan kode yang menargetkan .NET runtime adalah kode yang dikelola. Unit biner yang berisi kode yang dikelola disebut majelis (rincian lebih lanjut tentang majelis hanya dalam sedikit). Sebaliknya, kode yang tidak dapat di-host secara langsung oleh .NET runtime disebut sebagai kode yang tidak dikelola.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.