Różnica między „zarządzanym” a „niezarządzanym”

138

Słyszę / czytam o tym czasami, gdy mówię o .NET, na przykład „kod zarządzany” i „kod niezarządzany”, ale nie mam pojęcia, czym one są i jakie są między nimi różnice. Jaka jest ich różnica z definicji? Jakie są konsekwencje korzystania z któregokolwiek z nich? Czy to rozróżnienie istnieje tylko w .NET / Windows?

Louis Rhys
źródło

Odpowiedzi:

190

Kod zarządzany

Kod zarządzany jest tym, co kompilatory Visual Basic .NET i C # tworzą. Działa w środowisku CLR (Common Language Runtime), który między innymi oferuje usługi takie jak wyrzucanie elementów bezużytecznych, sprawdzanie typów w czasie wykonywania i sprawdzanie referencji. Pomyśl o tym jako o „Moim kodzie zarządza CLR”.

Visual Basic i C # mogą tworzyć tylko kod zarządzany, więc jeśli piszesz aplikację w jednym z tych języków, piszesz aplikację zarządzaną przez środowisko CLR. Jeśli piszesz aplikację w języku Visual C ++ .NET, możesz utworzyć kod zarządzany, jeśli chcesz, ale jest to opcjonalne.

Kod niezarządzany

Kod niezarządzany kompiluje się bezpośrednio do kodu maszynowego. Zatem zgodnie z tą definicją cały kod skompilowany przez tradycyjne kompilatory C / C ++ jest „kodem niezarządzanym”. Ponadto, ponieważ kompiluje się do kodu maszynowego, a nie do języka pośredniego, nie jest przenośny.

Żadnego wolnego zarządzania pamięcią ani niczego innego, co zapewnia CLR.

Ponieważ nie można tworzyć niezarządzanego kodu w języku Visual Basic lub C #, w programie Visual Studio cały niezarządzany kod jest napisany w języku C / C ++.

Mieszanie dwóch

Ponieważ Visual C ++ można skompilować do kodu zarządzanego lub niezarządzanego, możliwe jest połączenie tych dwóch elementów w tej samej aplikacji. To zaciera granicę między nimi i komplikuje definicję, ale warto o tym wspomnieć, aby wiedzieć, że nadal możesz mieć wycieki pamięci, jeśli na przykład używasz biblioteki innej firmy z jakimś źle napisanym niezarządzanym kodem.

Oto przykład znalazłem przez googlowania :

#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;
}
kurige
źródło
11
„Ponieważ nie można tworzyć niezarządzanego kodu w języku Visual Basic lub C #, cały niezarządzany kod jest napisany w języku C / C ++.”? Wiesz, istnieją inne języki niż C, C ++, C # i VB. Używam Delphi do pisania niezarządzanego kodu. Jedną raczej widoczną różnicą między kodem zarządzanym (.NET) i niezarządzanym (Win32) jest to, że ten pierwszy może korzystać ze wszystkich funkcji .NET, podczas gdy drugi korzysta z natywnego interfejsu API systemu Windows.
Andreas Rejbrand,
22
Pojęcia „zarządzany” i „niezarządzany” zostały wynalezione w celu odróżnienia kodu maszynowego od IR. Dlatego tak naprawdę mają znaczenie tylko w kontekście .NET . Jądro Linuksa również kompiluje się do niezarządzanego kodu, ale to nie jest tak naprawdę istotne w dyskusji, prawda?
kurige
6
To wychodzi poza temat, ale chodzi mi o to, że nie masz możliwości pisania kodu zarządzanego w Delphi, więc stwierdzenie, że piszesz niezarządzany kod w Delphi, jest wysoce nadmiarowe. W każdym razie do obraźliwego zdania dodałem „w studio wizualnym”. Dziękuję również za ostrzeżenia dotyczące literówki. Jakoś przegapiłem to nawet przy drugim przeczytaniu.
kurige
Aby być pedandem, można napisać niezarządzany kod w C # ( znany jako kod „niebezpieczny” )
Podstawowy
2
@JacksonTale Java nie jest w kontekście .NET, więc koncepcja zarządzania lub niezarządzania nie ma zastosowania. Zobacz stackoverflow.com/questions/1326071/…, aby uzyskać wyjaśnienie, jak kompiluje się Java.
Evan Frisch
84

Jest to bardziej ogólne niż .NET i Windows. Zarządzane to środowisko, w którym masz automatyczne zarządzanie pamięcią, wyrzucanie elementów bezużytecznych, bezpieczeństwo typów ... wszystko inne jest niezarządzane. Na przykład .NET jest środowiskiem zarządzanym, a C / C ++ jest niezarządzane.

Darin Dimitrov
źródło
Zgodnie z tą definicją JavaScript również byłby kodem niezarządzanym, prawda?
Hampton Terry,
@HamptonTerry Javascript ma automatyczne zarządzanie pamięcią, zbieranie śmieci i bezpieczeństwo typów ... Więc nie. Javascript jest zarządzany.
Sancarn
13

Kod zarządzany to zróżnicowanie opracowane przez firmę Microsoft w celu zidentyfikowania kodu programu komputerowego, który wymaga i będzie wykonywany tylko w ramach „zarządzania” maszyną wirtualną Common Language Runtime (w wyniku czego powstaje kod bajtowy).

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

RobertPitt
źródło
1
Tak. Aby dodać do tej odpowiedzi, kod zarządzany to kod, który normalnie piszesz w .NET (na przykład w C #), używając funkcji .NET. Z drugiej strony, natywne aplikacje Windows używające natywnego Windows API (napisane w dowolnym języku, być może w C) są „niezarządzane”.
Andreas Rejbrand,