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


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.