Co to jest kod zarządzany lub niezarządzany w programowaniu?

150

Używam określonego polecenia w moim kodzie C #, które działa dobrze. Jednak mówi się, że źle się zachowuje w kodzie „niezarządzanym”.

Co to jest kod zarządzany lub niezarządzany?

Pokus
źródło

Odpowiedzi:

75

Oto tekst z MSDN dotyczący kodu niezarządzanego .

Część kodu biblioteki musi wywoływać niezarządzany kod (na przykład interfejsy API kodu natywnego, takie jak Win32). Ponieważ oznacza to wyjście poza granicę zabezpieczeń kodu zarządzanego, wymagana jest ostrożność.

Oto kilka dodatkowych wyjaśnień na temat kodu zarządzanego:

  • Kod wykonywany przez środowisko CLR.
  • Kod, który jest przeznaczony dla środowiska uruchomieniowego języka wspólnego, będącego podstawą platformy .NET Framework, jest nazywany kodem zarządzanym.
  • Kod zarządzany dostarcza metadane niezbędne dla środowiska CLR do świadczenia usług, takich jak zarządzanie pamięcią, integracja międzyjęzykowa, zabezpieczenia dostępu do kodu i automatyczna kontrola okresu istnienia obiektów. Cały kod oparty na IL jest wykonywany jako kod zarządzany.
  • Kod wykonywany w środowisku wykonawczym CLI.

Twój problem:

Myślę, że dzieje się tak, ponieważ NUnit wykonuje twój kod dla UnitTesting i może mieć część tego, która jest niezarządzana. Ale nie jestem tego pewien, więc nie bierz tego za złoto. Jestem pewien, że ktoś będzie mógł udzielić Ci więcej informacji na ten temat. Mam nadzieję, że to pomoże!

Patrick Desjardins
źródło
12
Doceniam wysiłek włożony w twoją odpowiedź. ale ludzie, którzy nie wiedzą, czym jest „kod zarządzany”, będą mieli problem z tym, co masz na myśli w swojej odpowiedzi: nie będą wiedzieć: „kod biblioteki”, „kod niezarządzany”, „interfejs API kodu natywnego”, CLR, podstawa .net framework, IL, środowiska wykonawczego CLI itp.
BKSpurgeon
200

To dobry artykuł na ten temat.

Podsumowując,

  1. Kod zarządzany nie jest kompilowany do kodu maszynowego, ale do języka pośredniego, który jest interpretowany i wykonywany przez jakąś usługę na maszynie i dlatego działa w (miejmy nadzieję!) Bezpiecznej strukturze, która obsługuje niebezpieczne rzeczy, takie jak pamięć i wątki. We współczesnym zastosowaniu często oznacza to .NET, ale nie musi.

Aplikacja, która jest wykonywana w mechanizmie wykonawczym zainstalowanym na tej samej maszynie. Aplikacja nie może działać bez niej. Środowisko wykonawcze udostępnia ogólną bibliotekę procedur programowych, z których korzysta program i zazwyczaj zarządza pamięcią. Może również zapewniać konwersję just-in-time (JIT) z kodu źródłowego na kod wykonywalny lub z języka pośredniego na kod wykonywalny. Przykłady silników wykonawczych to Java, Visual Basic i .NET's Common Language Runtime (CLR). ( Czytaj więcej )

  1. Kod niezarządzany jest kompilowany do kodu maszynowego i dlatego jest wykonywany bezpośrednio przez system operacyjny. Dlatego ma możliwość robienia niszczących / potężnych rzeczy. Kod zarządzany nie. Tak wszystko kiedyś działało, więc zwykle jest to związane ze starymi plikami, takimi jak .dll.

Program wykonywalny, który działa samodzielnie. Uruchomiony z systemu operacyjnego program wywołuje i wykorzystuje procedury oprogramowania w systemie operacyjnym, ale nie wymaga użycia innego systemu oprogramowania. Montaż programów językowych, które zostały złożone w języku maszynowym i C / C ++ programy opracowane w języku maszynowym dla konkretnej platformy są przykładami kodu niezarządzanego. ( Czytaj więcej )

  1. Kod natywny jest często synonimem niezarządzanego, ale nie jest identyczny.
annakata
źródło
masz na myśli to, że podczas hakowania nie możemy użyć .net langauge (C #, C ++), prawda?
Haroon A.
7
@H_wardak Co definiujesz jako „hakowanie”? to bardzo ogólny termin, to tak, jakby powiedzieć, że włamywanie się do NORAD i hakowanie niektórych rejestrów to to samo.
Alex
7
Kiedyś zostałem zapytany przez ankietera, czy możemy uruchomić / napisać niezarządzany kod w C #? Czy ktoś może w tym pomóc?
RSB,
9
@RSB: nie można pisać niezarządzanego kodu w C # (chociaż można bezpośrednio wywołać niezarządzany kod z C #). Teoretycznie, z odpowiednim kompilatorem i frameworkiem, można by to zrobić. W praktyce oznacza to, że potrzebujesz kompilatora, który mógłby bezpośrednio skompilować C # do kodu maszynowego. Nie wiem, jak to zadziała.
James Haug,
67

Kiedy myślisz o niezarządzanym kodzie, pomyśl o kodzie na poziomie maszyny. Jak język asemblera x86. Kod niezarządzany (natywny) jest kompilowany i linkowany w celu uruchomienia bezpośrednio na procesorze, dla którego został zaprojektowany, z wyłączeniem wszystkich elementów systemu operacyjnego. Nie jest przenośny, ale jest szybki. Bardzo prosty, uproszczony kod.

Kod zarządzany to wszystko, od Javy po stary interpretacyjny BASIC, lub cokolwiek, co działa pod .NET. Kod zarządzany jest zwykle kompilowany do kodu P poziomu pośredniego lub zestawu instrukcji kodu bajtowego. Nie są to instrukcje specyficzne dla maszyny, chociaż wyglądają podobnie do języka asemblera. Zarządzany kod izoluje program od maszyny, na której działa, i tworzy bezpieczną granicę, w której cała pamięć jest przydzielana pośrednio, i ogólnie rzecz biorąc, nie masz bezpośredniego dostępu do zasobów maszyny, takich jak porty, przestrzeń adresowa pamięci, stos itp. Chodzi o to, aby działać w bezpieczniejszym środowisku.

Aby przekonwertować, powiedzmy, zmienną zarządzaną na niezarządzaną, musisz dostać się do samego obiektu. Prawdopodobnie jest zapakowany lub zapakowany w dodatkowe opakowanie. Zmienne niezarządzane (na przykład „int”) - na komputerze 32-bitowym - zajmują dokładnie 4 bajty. Nie ma narzutu ani dodatkowego opakowania. Proces przechodzenia od kodu zarządzanego do niezarządzanego - iz powrotem - nazywa się „ marszowaniem ”. Pozwala programom przekraczać granice.

TJPowell
źródło
1
Jak zatem mashalling współdziała z typami wartości i referencji? Pamiętam, że widziałem na przykład coś o MarshalByRefObject.
Kyle Baran
24

W jak najmniejszej liczbie słów:

  • kod zarządzany = programy .NET
  • kod niezarządzany = „normalne” programy
Vilx-
źródło
16
program .NET nie jest „normalny”?
jtate
1
@jtate - To trochę przygnębiające, tak. :) Starałem się, aby było bardziej intuicyjne. W każdym razie to było ponad 8 lat temu. Dzisiaj, przy niezliczonej liczbie języków programowania w powszechnym codziennym użyciu, to rozróżnienie jest rzeczywiście jeszcze bardziej nieprecyzyjne, tak.
Vilx-
5

Kod zarządzany jest tym, co kompilatory C # .Net, VB.Net, F # .Net itp. Tworzą. Działa na środowisku CLR, które oferuje między innymi usługi takie jak wyrzucanie elementów bezużytecznych, sprawdzanie referencji i wiele więcej. Pomyśl o tym jako o moim kodzie zarządzanym przez CLR.

Z drugiej strony niezarządzany kod kompiluje się bezpośrednio do kodu maszynowego. Nie zarządza przez CLR.

Arif
źródło
4

Zasadniczo kod niezarządzany to kod, który nie działa w środowisku .NET CLR (inaczej niż w VB.NET, C # itp.). Domyślam się, że NUnit ma runner / wrapper, który nie jest kodem .NET (aka C ++).

joegtp
źródło
4

Kod zarządzany:
kod działający na podstawie „umowy o współpracy” ze środowiskiem wykonawczym języka wspólnego. Kod zarządzany musi dostarczać metadane niezbędne dla środowiska wykonawczego do świadczenia usług, takich jak zarządzanie pamięcią, integracja międzyjęzykowa, zabezpieczenia dostępu do kodu i automatyczna kontrola okresu istnienia obiektów. Cały kod oparty na języku pośrednim firmy Microsoft (MSIL) jest wykonywany jako kod zarządzany.

Kod niezarządzany:
kod tworzony bez uwzględnienia konwencji i wymagań środowiska wykonawczego języka wspólnego. Kod niezarządzany jest wykonywany w środowisku uruchomieniowym języka wspólnego z minimalną liczbą usług (na przykład bez wyrzucania elementów bezużytecznych, ograniczone debugowanie itd.).

Źródła: http://www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx

GMalla
źródło
3

NUnit ładuje testy jednostkowe w osobnej domenie AppDomain i zakładam, że punkt wejścia nie jest wywoływany (prawdopodobnie nie jest potrzebny), dlatego zestaw wejścia jest pusty.

leppie
źródło
2

Kod zarządzany działa w środowisku CLR, tj. Środowiska uruchomieniowego .NET Krótko mówiąc, całe IL jest kodem zarządzanym, ale jeśli używasz jakiegoś oprogramowania innej firmy, np. Komponentu VB6 lub VC ++, jest to kod niezarządzany, ponieważ środowisko uruchomieniowe .NET (CLR) nie ma kontroli nad wykonaniem kodu źródłowego języka.

chirag Makwana
źródło
1

Kod zarządzany: - Kod, którego forma MSIL (język pośredni) jest tworzona po kompilacji kompilatora języka i bezpośrednio wykonywana przez CLRwywołany kod zarządzany. Np .: - Cały 61 kod językowy obsługiwany przez .NET Framework

Kod niezarządzany: - kod, który został opracowany wcześniej, .netdla którego formularz MSIL nie jest dostępny i jest wykonywany CLRbezpośrednio, raczej CLRprzekierowuje do systemu operacyjnego, co jest znane jako kod niezarządzany.

np .: -COM, Win32 API

Ashok Narwal
źródło
W tym poście jest wiele błędów. Najwyraźniej MISL (masz na myśli MSIL).
Matt Seymour,
1
  • Kod zarządzany : kod napisany w języku .NET, np. C #, VB.NET.
  • Kod niezarządzany : kod nie jest napisany w języku .NET, a MSIL nie rozumie, co to jest i nie może działać w środowisku CLR; podobnie jak kontrolki innych firm, których używaliśmy w naszych aplikacjach .NET, które nie są tworzone w językach .NET.
Saket Kumar
źródło
0

Przede wszystkim to zrozumieć, zanim .NET framework, Microsoftzostały dostarczanie produktów autonomicznych jak MFC (Visual C++), VB, FoxProetc.

W 2002 roku Microsoft połączył swoje produkty i stworzył platformę .NET. Teraz istnieje różnica między tym, jak kod był wykonywany wcześniej, a sposobem zarządzania kodem i jego wykonywania w środowisku .NET. Microsoft wprowadził koncepcję CLRz frameworkiem .NET, który kompiluje kod pochodzący z dowolnej obsługiwanej wersji językowej frameworka .NET i zapewnia dodatkowe funkcje, takie jak memory mangement, garbage collectionitp. Jednak takie funkcje CLR nie były wcześniej dostępne bezpośrednio.

Więc jeśli tworzysz bibliotekę / kod w .NET Framework (skompilowany za pomocą CLR), to nazywa się to Managed code. Możesz dalej korzystać z tej biblioteki w innych aplikacjach / projektach .NET i tam też CLR zrozumie, jak zostało skompilowane wcześniej i dlatego pozostaje twoim kodem zarządzającym.

OTOH, jeśli chcesz korzystać z bibliotek, które zostały napisane przed platformą .NET, możesz to zrobić z pewnymi ograniczeniami, ale pamiętaj, ponieważ CLR wtedy nie było, więc teraz CLR nie zrozumie i nie skompiluje ponownie tego kodu . I to się nazywa unmanaged code. Należy pamiętać, że biblioteki / zestawy utworzone przez jakąś stronę trzecią w celu zapewnienia określonych funkcji / narzędzi mogą być również uważane za kod niezarządzający, jeśli nie są zgodne z CLR.

W kategoriach laików zarządzanie kodem jest czymś, co Twoje środowisko CLR rozumie i może samodzielnie skompilować w celu dalszego wykonania. W środowisku .NET (z dowolnego języka, który działa na platformie .NET). Gdy kod trafia do środowiska CLR, kod dostarcza pewne informacje metadane, dzięki czemu środowisko CLR może udostępniać określone tutaj funkcje . Niewielu z nich jest Garbage collection, Performance improvements, cross-language integration, memory managementitp.

OTOH, niezmieniony kod jest czymś specyficznym dla maszyny i jest gotowy do użycia, nie ma potrzeby dalszego przetwarzania.

Amnesh Goel
źródło
Obawiam się, że wiele, wiele, wiele niedoinformowanych opinii. Może to być niespodzianką, ale CLR może również wykonywać niezarządzany kod (zwykle napisany w C ++ / CLI). Nie ma również wymagania, aby kod zarządzany był dostępny jako IL. NET Native istnieje już od jakiegoś czasu i zawiera wstępnie skompilowane zestawy. To, co nazywasz „zgodnym z CLR”, prawdopodobnie oznacza, że ​​jest „zgodne z CLS” . Niespełnienie zgodności z CLS nie powoduje, że kod zarządzany staje się nagle niezarządzany. Konsumpcja niezarządzanego kodu - pomimo twojego opisu - również jest całkiem łatwa (RCW przez COM, P / Invoke, C ++ / CLI itp.).
Niespodziewane
0

Z Pro C # 5 i .NET 4.5 Framework:

Kod zarządzany i niezarządzany: Być może najważniejszą kwestią do zrozumienia języka C # jest to, że może on tworzyć kod, który może być wykonywany tylko w środowisku wykonawczym .NET (nigdy nie można użyć języka C # do zbudowania natywnego serwera COM lub niezarządzanego C / C ++ podanie). Oficjalnie termin używany do opisu kodu przeznaczonego dla środowiska uruchomieniowego .NET to kod zarządzany. Jednostka binarna, która zawiera zarządzany kod, jest nazywana zestawem (więcej szczegółów na temat zestawów za chwilę). I odwrotnie, kod, którego nie można bezpośrednio hostować w środowisku wykonawczym .NET, jest nazywany kodem niezarządzanym.

arush436
źródło