Що таке керований чи некерований код у програмуванні?


150

Я використовую конкретну команду в своєму C # коді, який добре працює. Однак, як кажуть, неправильно поводитись у "некерованому" коді.

Що таке керований чи некерований код?


Відповіді:


75

Ось текст із MSDN про некерований код .

Деякий код бібліотеки потребує входу в некерований код (наприклад, API нативного коду, наприклад, Win32). Оскільки це означає, що для керованого коду виходять за межі периметра безпеки, необхідна обережність.

Ось кілька додаткових пояснень щодо керованого коду:

  • Код, який виконується CLR.
  • Код, орієнтований на загальну мову виконання, основу .NET Framework, відомий як керований код.
  • Керований код надає метадані, необхідні CLR для надання таких послуг, як управління пам'яттю, інтеграція між мовою, захист доступу до коду та автоматичне управління об'єктами протягом усього життя. Весь код на основі IL виконується як керований код.
  • Код, який виконується в середовищі виконання CLI.

Для вашої проблеми:

Я думаю, це тому, що NUnit виконує ваш код для UnitTesting і може мати частину його, яка не управляється. Але я не впевнений у цьому, тому не бери це за золото. Я впевнений, що хтось зможе дати вам більше інформації про це. Сподіваюся, це допомагає!


12
Я ціную зусилля, що потрапляють у вашу відповідь. але люди, які не знають, що таке "керований код", боротимуться з тим, що ви маєте на увазі у своїй відповіді: вони не знають: "код бібліотеки", "некерований код", "API рідного коду", CLR, заснування рамки .net, IL, середовища виконання CLI тощо тощо
BKSpurgeon

200

Це гарна стаття про цю тему.

Узагальнити,

  1. Керований код складається не з машинного коду, а з проміжної мови, що інтерпретується та виконується деяким сервісом на машині і тому працює в (сподіваюсь!) Захищеній рамці, яка обробляє небезпечні для вас речі, такі як пам'ять і потоки. У сучасному використанні це часто означає .NET, але цього не потрібно.

Прикладна програма, яка виконується в межах двигуна виконання, встановленого в одній машині. Програма не може працювати без неї. Середовище виконання забезпечує загальну бібліотеку програмних процедур, які програма використовує і зазвичай виконує управління пам'яттю. Він також може забезпечити перетворення в JIT (термін в часі) з вихідного коду у виконуваний код або з проміжної мови у виконуваний код. Java, Visual Basic та .NET загальна мова виконання (CLR) - приклади двигунів виконання. ( Детальніше )

  1. Некерований код компілюється в машинний код і тому виконується безпосередньо ОС. Тому він має можливість робити згубні / потужні речі Керований код не робить. Ось як працювало все, тому зазвичай це пов'язано зі старими речами, такими як .dlls.

Виконавча програма, яка працює сама по собі. Запущена з операційної системи, програма вимагає і використовує програмні процедури в операційній системі, але не вимагає використання іншої програмної системи. Програми мовної збірки, зібрані в машинну мову, та програми C / C ++, зібрані в машинну мову для певної платформи, є прикладами некерованого коду. ( Детальніше )

  1. Рідний код часто є синонімом Unmanaged, але не є тотожним.

ви маєте на увазі, що в злому ми не можемо використовувати .net langauge (C #, C ++), правда?
Харун А.

7
@H_wardak, що ти визначаєш як "злом"? це дуже загальний термін, це як сказати, що зламати NORAD і зламати деякі регістри - те саме.
Олексій

7
Мене одного разу запитали інтерв'юер, чи можемо ми запустити / записати некерований код у C #? Хтось може допомогти з цього приводу?
RSB

9
@RSB: Ви не можете писати некерований код у C # (хоча ви можете безпосередньо зателефонувати некерованому коду з C #). Теоретично, з правильним компілятором і фреймворком, ви могли це зробити. На практиці це означає, що вам знадобиться компілятор, який міг би скласти C # для машинного коду безпосередньо. Не впевнений, як це буде працювати.
Джеймс Хауг

67

Коли ви думаєте про некерований , подумайте про код машини на рівні машини. Як і мова монтажу x86. Некерований (рідний) код збирається та пов'язується для запуску безпосередньо на процесорі, для якого він був розроблений, виключаючи на даний момент усі елементи ОС. Це не портативно, але це швидко. Дуже простий, знятий код.

Керований код - це все, починаючи від Java до старого Interpretive BASIC, або все, що працює під .NET. Керований код, як правило, компілюється в P-код проміжного рівня або набір інструкцій байтового коду. Це не специфічні для машини інструкції, хоча вони схожі на мову складання. Керований код ізолює програму від машини, на якій вона працює, і створює захисну межу, в якій вся пам’ять розподіляється опосередковано, і взагалі кажучи, у вас немає прямого доступу до машинних ресурсів, таких як порти, адресний простір пам'яті, стек тощо Ідея полягає у запуску в більш безпечному середовищі.

Щоб перетворитись із керованої змінної, скажімо, у некеровану, потрібно дістатись до власне об'єкта. Ймовірно, загорнуті або упаковані в якусь додаткову упаковку. Не керовані змінні (наприклад, 'int', скажімо) - на 32-бітній машині - займають рівно 4 байти. Немає накладних або додаткових упаковок. Процес переходу від керованого до некерованого коду - і знову - називається " маршалінг ". Це дозволяє вашим програмам перейти межу.


1
Як тоді взаємодія взаємодії зі значеннями та типовими типами? Я пам’ятаю, наприклад, щось бачив про MarshalByRefObject.
Кайл Баран

24

Як можна менше слів:

  • керований код = .NET програми
  • unmanaged code = "нормальні" програми

16
програма .NET не є "нормальною"?
jtate

1
@jtate - Це трохи скидає, так. :) Я намагався зробити це більш інтуїтивно зрозумілим. У всякому разі, це було понад 8 років тому. Сьогодні, маючи безліч мов програмування у звичайному повсякденному використанні, ця відмінність є ще більш неточною, так.
Vilx-

5

Керований код - це те, що створюють компілятори C # .Net, VB.Net, F # .Net тощо. Він працює на CLR, який, крім усього іншого, пропонує такі послуги як вивезення сміття, перевірка довідок та багато іншого. Тож подумайте так, моїм кодом керується CLR.

З іншого боку, некерований код збирається безпосередньо до машинного коду. Це не управляє CLR.


4

В основному некерований код - це код, який не працює під .NET CLR (він же не VB.NET, C # тощо). Я здогадуюсь, що NUnit має бігун / обгортку, яка не є кодом .NET (він же C ++).


4

Керований код:
Код, який працює за "договором про співпрацю" із загальною мовою виконання. Керований код повинен надавати метадані, необхідні для виконання для надання таких послуг, як управління пам'яттю, інтеграція між мовою, захист доступу до коду та автоматичне управління об'єктами протягом усього життя. Весь код на основі проміжного мови Microsoft (MSIL) виконується як керований код.

Некерований код:
Код, який створюється без урахування конвенцій та вимог загальної мови виконання. Некерований код виконується в загальному мовному середовищі виконання з мінімальними послугами (наприклад, відсутність вивезення сміття, обмежена налагодження тощо).

Довідка: http://www.dotnetspider.com/forum/11612-difference-bet between-managed-and-unmanaged- code.aspx


3

NUnit завантажує одиничні тести в окремий AppDomain, і я припускаю, що точка входу не викликається (ймовірно, не потрібна), отже, збірка запису є нульовою.


2

Керований код працює всередині середовища CLR, тобто .NET runtime. Коротше кажучи, всі IL управляються кодом. Але якщо ви використовуєте сторонні програмні продукти, наприклад VB6 або VC ++, вони керують кодом, оскільки .NET runtime (CLR) не має контролю над виконанням мови вихідним кодом.


1

Керований код: - Код, форма MSIL (проміжна мова) розробляється після складання компілятора мови та безпосередньо виконується за допомогою CLRназиваного керованого коду. наприклад: - Всі 61 мовний код, підтримуваний .net Framework

Некерований код: - код, розроблений раніше, .netдля якого форма MSIL недоступна, і виконується CLRбезпосередньо, а CLRперенаправить на операційну систему, це відоме як некерований код.

наприклад: API -COM, Win32


У цій публікації є ряд помилок. Найбільш очевидно MISL (ви маєте на увазі MSIL).
Метт Сеймур

1
  • Керований код: код, написаний мовою .NET на зразок C #, VB.NET.
  • UnManaged Code: код не написаний мовою .NET, а MSIL не розуміє, що це таке, і не може працювати під CLR; як сторонні управління, які ми використовували в наших .NET-додатках, які не створені мовами .NET.

0

Перш за все, це розуміємо, перед тим .NET framework, Microsoftяк пропонували окремі продукти, як-то MFC (Visual C++), VB, FoxProі т.д.

У 2002 році Microsoft об'єднала свої продукти і створила .NET Framework. Тепер існує різниця між тим, як виконувався код раніше, і тим, як керується кодом і виконується в .NET Framework. Microsoft представила концепцію CLR.NET Framework, яка компілює код, що надходить з будь-якої підтримуваної ланцюги .NET Framework та надає додаткові функції, наприклад, memory mangement, garbage collectionтощо. Але такі функції CLR раніше не були доступні безпосередньо.

Отже, якщо ви створюєте бібліотеку / код у .NET Framework (компілюється з CLR), тоді це називається Managed code. Ви можете використовувати цю бібліотеку далі в іншому додатку / проект .NET, і там CLR зрозуміє, як вона була складена раніше, і тому вона залишається вашим кодом управління.

OTOH, якщо ви хочете використовувати бібліотеки, написані до .NET Framework, то ви можете робити певні обмеження, але пам’ятайте, оскільки CLR тоді не було, тому CLR не зрозуміє і не скомпілює цей код ще раз . І це буде називатисяunmanaged code . Зауважте, що бібліотеки / збірки, створені третьою стороною для надання певних функцій / інструменту, також можуть розглядатися як некерований код, якщо це не сумісність CLR.

По-простому, керування кодом - це те, що ваш CLR розуміє, і може скласти його самостійно для подальшого виконання. У .NET Framework (з будь-якої мови, що працює на .NET Framework) Коли код переходить до CLR, тоді код надає деяку інформацію мета-даних, щоб CLR може надавати вам вказані тут функції . Мало з них і Garbage collection, Performance improvements, cross-language integration, memory managementт.д.

OTOH, некерований код - це щось специфічне для машини та готове до використання, не потрібно його додатково обробляти.


Боюсь, багато і багато неінформованої думки. Це може стати несподіванкою, але CLR може також виконувати некерований код (як правило, написаний на C ++ / CLI). Також немає вимоги, щоб керований код був доступний як IL. .NET Native вже деякий час існує, і він поставляється з попередньо складеними збірками. Те, що ви назвали "сумісним з CLR" , ймовірно, означає "сумісне з CLS" . Невиконання відповідності CLS не робить керований код некерованим, раптом. Споживання некерованого коду - незважаючи на ваш опис - також досить просто (RCW над COM, P / Invoke, C ++ / CLI тощо).
Неочікуваний

0

З Pro C # 5 та .NET 4.5:

Керований проти некерованого коду: Мабуть, найважливіший момент, який потрібно зрозуміти про мову C #, - це те, що він може створювати код, який може виконуватись лише протягом .NET часу виконання (ви ніколи не можете використовувати C # для створення рідного COM-сервера або некерованого C / C ++ додаток). Офіційно кажучи, термін, який використовується для опису коду, орієнтованого на .NET виконання, управляється кодом. Двійкова одиниця, що містить керований код, називається збіркою (детальніше про збірки лише трохи). І навпаки, код, який не може бути безпосередньо розміщений в ході виконання .NET, називається некерованим кодом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.