"관리되는"과 "관리되지 않는"의 차이점


138

.NET에 대해 이야기 할 때 "관리되는 코드"및 "관리되지 않는 코드"와 같은 경우가 가끔 있습니다. 정의상 차이점은 무엇입니까? 둘 중 하나를 사용하면 어떤 결과가 발생합니까? 이 차이점은 .NET / Windows에만 존재합니까?


답변:


190

관리 코드

관리 코드는 Visual Basic .NET 및 C # 컴파일러가 만드는 것입니다. CLR (Common Language Runtime)에서 실행되며 가비지 수집, 런타임 유형 확인 및 참조 확인과 같은 서비스를 제공합니다. "내 코드는 CLR에 의해 관리 됩니다." 라고 생각 하십시오.

Visual Basic 및 C #은 관리 코드 만 생성 할 수 있으므로 해당 언어 중 하나로 응용 프로그램을 작성하는 경우 CLR에서 관리하는 응용 프로그램을 작성합니다. Visual C ++ .NET에서 응용 프로그램을 작성하는 경우 원하는 경우 관리 코드를 생성 할 수 있지만 선택 사항입니다.

비 관리 코드

비 관리 코드는 기계 코드로 바로 컴파일됩니다. 따라서이 정의에 따르면 기존 C / C ++ 컴파일러가 컴파일 한 모든 코드는 '관리되지 않는 코드'입니다. 또한 중간 언어가 아닌 머신 코드로 컴파일되므로 이식 할 수 없습니다.

무료 메모리 관리 또는 CLR이 제공하는 다른 것은 없습니다.

Visual Basic 또는 C #으로 관리되지 않는 코드를 만들 수 없으므로 Visual Studio에서는 모든 관리되지 않는 코드가 C / C ++로 작성됩니다.

두 가지를 혼합

Visual C ++는 관리되는 코드 나 관리되지 않는 코드로 컴파일 할 수 있으므로 동일한 응용 프로그램에서 두 가지를 혼합 할 수 있습니다. 이것은 둘 사이의 경계를 흐리게하고 정의를 복잡하게하지만, 예를 들어 잘못 관리되지 않은 코드가있는 타사 라이브러리를 사용하는 경우 여전히 메모리 누수가 발생할 수 있음을 알 가치가 있습니다.

다음은 인터넷 검색 에서 찾은 예입니다 .

#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
"Visual Basic 또는 C #으로 관리되지 않는 코드를 만들 수 없으므로 모든 관리되지 않는 코드는 C / C ++로 작성됩니다." C, C ++, C # 및 VB 이외의 언어가 있습니다. 관리되지 않는 코드를 작성하기 위해 Delphi를 사용합니다. 또한 관리되는 코드 (.NET)와 관리되지 않는 코드 (Win32)의 차이점 중 하나는 전자가 모든 .NET 함수를 사용할 수 있지만 후자는 기본 Windows API를 사용할 수 있다는 것입니다.
— Andreas Rejbrand

22
'관리'및 '비 ​​관리'라는 용어는 기계 코드를 IR과 구별하기 위해 고안되었습니다. 따라서 .NET 컨텍스트에서만 의미가 있습니다. 리눅스 커널은 관리되지 않는 코드로 컴파일하지만 실제로 토론과 관련이 없습니까?
— kurige

6
이것은 주제에 맞지 않지만 내 요점은 델파이에서 관리 코드 를 작성 하는 옵션 이 없기 때문에 델파이에서 관리되지 않는 코드 를 작성한다는 것은 매우 중복 적이라는 것입니다 . 어쨌든, 나는 "비주얼 스튜디오에서"를 불쾌한 문장에 추가했습니다. 또한 오타에 대해 감사합니다. 어떻게 든 두 번째 판독으로도 놓쳤습니다.
— kurige

단순히 페달을 밟기 위해 관리되지 않는 코드를 C # ( "안전하지 않은"코드라고 함)에 작성할 수 있습니다.
— 기본

2
@JacksonTale Java는 .NET과 관련이 없으므로 관리되거나 관리되지 않는 개념은 적용되지 않습니다. Java 컴파일 방법에 대한 설명은 stackoverflow.com/questions/1326071/… 를 참조하십시오 .
— Evan Frisch

84

이것은 .NET 및 Windows보다 일반적입니다. 관리는 자동 메모리 관리, 가비지 수집, 유형 안전 등을 관리하는 환경입니다. 관리되지 않는 것이 전부입니다. 예를 들어 .NET은 관리되는 환경이고 C / C ++는 관리되지 않습니다.


이 정의에 따르면 JavaScript는 관리되지 않는 코드 일 것입니다. 맞습니까?
— Hampton Terry

@HamptonTerry Javascript에는 자동 메모리 관리, 가비지 수집 및 유형 안전성이 있습니다. 자바 스크립트가 관리됩니다.
— Sancarn

13

관리 코드는 공통 언어 런타임 가상 컴퓨터 (바이트 코드 결과)의 "관리"하에서 만 실행되고 실행되는 컴퓨터 프로그램 코드를 식별하기 위해 Microsoft에서 만들어 낸 차별화 요소입니다.

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
예. 이 답변에 추가하기 위해 관리 코드는 .NET 함수를 사용하여 .NET (예 : C #)에서 정상적으로 작성하는 코드입니다. 반면, 네이티브 Windows API (어쩌면 C로 작성)를 사용하는 네이티브 Windows 응용 프로그램은 "관리되지 않습니다".
— Andreas Rejbrand
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.