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?
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?
Odpowiedzi:
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:
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!
To dobry artykuł na ten temat.
Podsumowując,
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 )
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 )
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.
W jak najmniejszej liczbie słów:
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.
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
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.
Kod zarządzany: - Kod, którego forma MSIL (język pośredni) jest tworzona po kompilacji kompilatora języka i bezpośrednio wykonywana przez CLR
wywoł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, .net
dla którego formularz MSIL nie jest dostępny i jest wykonywany CLR
bezpośrednio, raczej CLR
przekierowuje do systemu operacyjnego, co jest znane jako kod niezarządzany.
np .: -COM, Win32 API
Przede wszystkim to zrozumieć, zanim .NET framework
, Microsoft
zostały dostarczanie produktów autonomicznych jak MFC (Visual C++), VB, FoxPro
etc.
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ę CLR
z 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 collection
itp. 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 management
itp.
OTOH, niezmieniony kod jest czymś specyficznym dla maszyny i jest gotowy do użycia, nie ma potrzeby dalszego przetwarzania.
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.