“Yönetilen” ve “yönetilmeyen” arasındaki fark


138

Bazen "yönetilen kod" ve "yönetilmeyen kod" gibi .NET hakkında konuşurken bazen duymak / okumak ama ne olduklarını ve farklılıkları neler olduğu hakkında hiçbir fikrim yok. Tanımlarına göre aralarındaki farklar nelerdir? İkisinden birini kullanmanın sonuçları nelerdir? Bu ayrım yalnızca .NET / Windows'ta var mı?


Yanıtlar:


190

Yönetilen Kod

Yönetilen kod, Visual Basic .NET ve C # derleyicilerinin oluşturduğu şeydir. Çöp toplama, çalışma zamanı türü denetimi ve referans denetimi gibi hizmetler sunan CLR (Ortak Dil Çalışma Zamanı) üzerinde çalışır. Bunu düşünün, " Kodum CLR tarafından yönetiliyor ."

Visual Basic ve C # yalnızca yönetilen kod üretebilir, bu nedenle, bu dillerden birinde bir uygulama yazıyorsanız, CLR tarafından yönetilen bir uygulama yazıyorsunuzdur. Visual C ++ .NET'te bir uygulama yazıyorsanız, isterseniz yönetilen kod üretebilirsiniz, ancak isteğe bağlıdır.

Yönetilmeyen Kod

Yönetilmeyen kod doğrudan makine kodunu derler. Yani, bu tanım gereği geleneksel C / C ++ derleyicileri tarafından derlenen tüm kodlar 'yönetilmeyen kod'dur. Ayrıca, bir ara dili değil, makine kodunu derlediğinden taşınabilir değildir.

Ücretsiz bellek yönetimi veya CLR'nin sağladığı başka bir şey yok.

Visual Basic veya C # ile yönetilmeyen kod oluşturamadığından, Visual Studio'da yönetilmeyen tüm kodlar C / C ++ ile yazılır.

İkisini karıştırma

Visual C ++ yönetilen veya yönetilmeyen koda derlenebilir çünkü ikisi aynı uygulamada karıştırmak mümkündür. Bu, ikisi arasındaki çizgiyi bulanıklaştırır ve tanımı karmaşıklaştırır, ancak örneğin kötü yazılmış bir yönetilmeyen kodla bir üçüncü taraf kütüphanesi kullanıyorsanız, bellek sızıntılarına sahip olabileceğinizi bilmeniz gerekir.

İşte googling ile bulduğum bir örnek :

#using <mscorlib.dll>
using namespace System;

#include "stdio.h"

void ManagedFunction()
{
    printf("Hello, I'm managed in this section\n");
}

#pragma unmanaged
UnmanagedFunction()
{
    printf("Hello, I am unmanaged through the wonder of IJW!\n");
    ManagedFunction();
}

#pragma managed
int main()
{
    UnmanagedFunction();
    return 0;
}

11
Msgstr "Yönetilmeyen kodu Visual Basic veya C # ile oluşturamadığınız için, yönetilmeyen tüm kod C / C ++ ile yazılmıştır."? Bilirsiniz, C, C ++, C # ve VB'den başka diller de vardır. Yönetilmeyen kod yazmak için Delphi kullanıyorum. Ayrıca, yönetilen (.NET) ve yönetilmeyen (Win32) kodu arasında oldukça göze çarpan bir fark, ilkinin tüm .NET işlevlerini kullanabilmesi, ikincisinin ise yerel Windows API'sını kullanmasıdır.
Andreas Rejbrand

22
Makine kodunu IR'den ayırmak için 'yönetilen' ve 'yönetilmeyen' terimleri icat edildi. Yani, sadece .NET bağlamında gerçekten bir anlamı var . Linux çekirdeği de yönetilmeyen kod için derleniyor, ancak bu tartışma ile gerçekten ilgili değil, değil mi?
kurige

6
Bu konu dışı oluyor, ama benim açımdan Delphi'de yönetilen kod yazma seçeneğiniz yok , bu yüzden Delphi'de yönetilmeyen kod yazdığınızı belirtmek son derece gereksiz. Her durumda, rahatsız edici cümleye "görsel stüdyoda" ekledim. Ayrıca, yazım hatası için teşekkürler. Her nasılsa ikinci bir okuma ile bile kaçırdım.
kurige

Sadece bir pedal olmak için, C # 'da yönetilmeyen kod yazmak mümkündür ( "güvensiz" kod olarak bilinir )
Basic

2
@JacksonTale Java, .NET bağlamında değildir, bu nedenle yönetilmesi veya yönetilmemesi kavramı geçerli değildir. Bkz stackoverflow.com/questions/1326071/... Java derleme yöntemiyle ilgili bir açıklama için.
Evan Frisch

84

Bu, .NET ve Windows'tan daha geneldir. Managed, otomatik bellek yönetimi, çöp toplama, tip güvenliği, ... yönetilmeyen bir ortamdır. Örneğin, .NET yönetilen bir ortamdır ve C / C ++ yönetilmez.


Bu tanıma göre, JavaScript yönetilmeyen kod da olabilir, değil mi?
Hampton Terry

@HamptonTerry Javascript otomatik bellek yönetimi, çöp toplama ve tip güvenliği vardır ... Yani hayır. Javascript yönetiliyor.
Sancarn

13

Yönetilen kod, Microsoft tarafından yalnızca Ortak Dil Çalışma Zamanı sanal makinesinin (Bytecode ile sonuçlanan) "yönetimi" altında çalışan ve yönetecek olan bilgisayar program kodunu tanımlamak için oluşturulan bir farklılaşmadır.

http://en.wikipedia.org/wiki/Managed_code

http://www.developer.com/net/cplus/article.php/2197621/Managed-Unmanaged-Native-What-Kind-of-Code-Is-This.htm


1
Evet. Bu yanıta eklemek için yönetilen kod, .NET işlevlerini kullanarak normalde .NET'te (örneğin C #) yazdığınız koddur. Öte yandan, yerel Windows API'sini (belki de herhangi bir dilde yazılmış olabilir) kullanan yerel Windows uygulamaları "yönetilmez".
Andreas Rejbrand
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.