프로그래밍에서 관리 또는 관리되지 않는 코드 란 무엇입니까?


150

C # 코드에서 특정 명령을 사용하고 있습니다. 그러나 "관리되지 않는"코드에서 잘못 작동한다고합니다.

관리 또는 관리되지 않는 코드 란 무엇입니까?


답변:


75

관리되지 않는 코드 에 대한 MSDN의 일부 텍스트는 다음과 같습니다 .

일부 라이브러리 코드는 관리되지 않는 코드 (예 : Win32와 같은 기본 코드 API)를 호출해야합니다. 이는 관리 코드의 보안 경계 외부로 나가는 것을 의미하므로주의해야합니다.

관리 코드에 대한 다른 무료 설명은 다음과 같습니다.

  • CLR에 의해 실행되는 코드입니다.
  • .NET Framework의 기초 인 공용 언어 런타임을 대상으로하는 코드를 관리 코드라고합니다.
  • 관리 코드는 CLR에 필요한 메타 데이터를 제공하여 메모리 관리, 언어 간 통합, 코드 액세스 보안 및 자동 객체 수명 제어와 같은 서비스를 제공합니다. IL 기반의 모든 코드는 관리 코드로 실행됩니다.
  • CLI 실행 환경에서 실행되는 코드입니다.

문제의 경우 :

NUnit이 UnitTesting을 위해 코드를 실행하고 관리되지 않는 부분이있을 수 있다고 생각합니다. 그러나 나는 그것에 대해 확신하지 못하므로 금으로 가져 가지 마십시오. 누군가가 당신에 대해 더 많은 정보를 줄 수 있다고 확신합니다. 그것이 도움이되기를 바랍니다!


12
귀하의 답변에 노력해 주셔서 감사합니다. 그러나 "관리 코드"가 무엇인지 모르는 사람들은 귀하의 답변에서 의미하는 바에 맞서 싸울 것입니다. "라이브러리 코드", "비 관리 코드", "기본 코드 API", CLR, .net 프레임 워크, IL, CLI 실행 환경 등의 기초
BKSpurgeon

200

이것은 주제에 관한 좋은 기사입니다.

요약,

  1. 관리 코드 는 머신 코드로 컴파일되지 않고 머신의 일부 서비스에서 해석되고 실행되는 중간 언어로 컴파일되므로 메모리 및 스레드와 같은 위험한 항목을 처리하는 안전한 프레임 워크 내에서 작동합니다. 현대의 사용에서 이것은 종종 .NET을 의미하지만 반드시 그런 것은 아닙니다.

동일한 머신에 설치된 런타임 엔진 내에서 실행되는 애플리케이션 프로그램입니다. 응용 프로그램이 없으면 응용 프로그램을 실행할 수 없습니다. 런타임 환경은 프로그램이 사용하고 일반적으로 메모리 관리를 수행하는 일반 소프트웨어 루틴 라이브러리를 제공합니다. 또한 소스 코드에서 실행 코드로 또는 중간 언어에서 실행 코드로 JIT (just-in-time) 변환을 제공 할 수 있습니다. Java, Visual Basic 및 .NET의 CLR (공용 언어 런타임)은 런타임 엔진의 예입니다. ( 더 읽기 )

  1. 비 관리 코드 는 기계어 코드 로 컴파일되어 OS에서 직접 실행됩니다. 따라서 관리되는 코드가 수행하지 않는 강력한 작업을 수행 할 수 있습니다. 이것은 모든 것이 작동하는 방식이므로 일반적으로 .dll과 같은 오래된 것들과 관련이 있습니다.

자체적으로 실행되는 실행 프로그램. 운영 체제에서 시작된 프로그램은 운영 체제의 소프트웨어 루틴을 호출하고 사용하지만 다른 소프트웨어 시스템을 사용할 필요는 없습니다. 특정 플랫폼을위한 기계 언어로 조립 및 C / C ++ 프로그램을 기계어로 컴파일 된 어셈블리 언어 프로그램은 관리되지 않는 코드의 예입니다. ( 자세히보기 )

  1. 네이티브 코드는 종종 관리되지 않는 것과 동의어이지만 동일하지는 않습니다.

해킹에서 .net langauge (C #, C ++)를 사용할 수 없다는 것을 의미합니까?
Haroon A.

7
@H_wardak '해킹'으로 무엇을 정의하십니까? 이것은 매우 일반적인 용어입니다. NORAD에 대한 해킹과 일부 레지스터의 해킹은 동일합니다.
Alex

7
면접관이 한 번 물었습니다. C #에서 관리되지 않는 코드를 실행 / 작성할 수 있습니까? 누구든지 이것을 도울 수 있습니까?
RSB

9
@RSB : 관리되지 않는 코드를 C #으로 작성할 수는 없지만 C #에서 관리되지 않는 코드를 직접 호출 할 수 있습니다. 이론적으로 올바른 컴파일러와 프레임 워크를 사용하면 가능합니다. 실제로 이것은 C #을 기계 코드로 직접 컴파일 할 수있는 컴파일러가 필요하다는 것을 의미합니다. 어떻게 작동하는지 잘 모르겠습니다.
James Haug

67

비 관리 형 을 생각할 때는 기계 별 기계 수준 코드를 생각하십시오. x86 어셈블리 언어와 같습니다. 관리되지 않는 (네이티브) 코드는 컴파일되고 링크되어 현재 설계된 모든 프로세서를 제외하고 설계된 프로세서에서 직접 실행됩니다. 휴대용이 아니지만 빠릅니다. 매우 간단하고 제거 된 코드입니다.

관리되는 코드는 Java에서 기존 Interpretive BASIC 또는 .NET에서 실행되는 모든 것입니다. 관리 코드는 일반적으로 중간 레벨 P- 코드 또는 바이트 코드 세트로 컴파일됩니다. 이 지침은 어셈블리 언어와 비슷하지만 기계 별 지침은 아닙니다. 관리 코드는 프로그램이 실행되는 시스템에서 프로그램을 격리하고 모든 메모리가 간접적으로 할당되는 안전한 경계를 만들고 일반적으로 포트, 메모리 주소 공간, 스택 등과 같은 시스템 리소스에 직접 액세스 할 수 없습니다 보다 안전한 환경에서 실행하는 것이 좋습니다.

관리되는 변수를 관리되지 않는 변수로 변환하려면 실제 개체 자체에 도달해야합니다. 추가 포장으로 포장되거나 포장되어있을 수 있습니다. 32 비트 시스템에서 관리되지 않는 변수 (예 : 'int'와 같은)는 정확히 4 바이트를 사용합니다. 오버 헤드 또는 추가 패키징이 없습니다. 관리되는 코드에서 관리되지 않는 코드로 돌아가는 과정을 " 마샬링 "이라고합니다. 프로그램이 경계를 넘을 수 있습니다.


1
그러면 마샬링이 어떻게 값 및 참조 유형과 상호 작용합니까? 예를 들어 MarshalByRefObject에 대해 뭔가를 본 것을 기억합니다.
Kyle Baran

24

가능한 한 적은 단어로 :

  • 관리 코드 = .NET 프로그램
  • 비 관리 코드 = "정상"프로그램

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

관리 코드 :
공용 언어 런타임과 "협력 계약"하에서 실행 되는 코드 입니다. 관리 코드는 메모리 관리, 언어 간 통합, 코드 액세스 보안 및 자동 객체 수명 제어와 같은 서비스를 제공하기 위해 런타임에 필요한 메타 데이터를 제공해야합니다. MSIL (Microsoft Intermediate Language)을 기반으로하는 모든 코드는 관리 코드로 실행됩니다.

관리되지 않는 코드 :
공용 언어 런타임의 규칙 및 요구 사항에 관계없이 만들어진 코드입니다. 관리되지 않는 코드는 최소한의 서비스 (예 : 가비지 수집 없음, 디버깅 제한 등)로 공용 언어 런타임 환경에서 실행됩니다.

참조 : http://www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx


3

NUnit은 별도의 AppDomain에서 단위 테스트를로드하고 진입 점이 호출되지 않고 (아마도 필요하지 않음) 엔트리 어셈블리가 null이라고 가정합니다.


2

관리 코드는 CLR, 즉 .NET 런타임 환경 내에서 실행됩니다. 즉, 모든 IL이 관리 코드입니다. 그러나 일부 타사 소프트웨어 예제 VB6 또는 VC ++ 구성 요소를 사용하는 경우 .NET 런타임 (CLR)이 제어 할 수 없으므로 관리되지 않는 코드입니다 언어의 소스 코드 실행.


1

관리 코드 :-언어 컴파일러 컴파일 후 MSIL (중급 언어) 형식으로 개발되고 CLR관리되는 코드에 의해 직접 실행 되는 코드입니다. -.net 프레임 워크에서 지원하는 모든 61 개 언어 코드

관리되지 않는 코드 : .net-MSIL 양식을 사용할 수없고 CLR직접 실행되는 CLR방식으로 개발 된 코드는 운영 체제로 리디렉션되어 관리되지 않는 코드라고합니다.

예 : -COM, Win32 API


이 게시물에는 여러 가지 실수가 있습니다. 가장 분명한 것은 MISL입니다 (MSIL을 의미).
매트 시모어

1
  • 관리 코드 : C #, VB.NET과 같은 .NET 언어로 작성된 코드입니다.
  • 관리 되지 않는 코드 : .NET 언어로 작성되지 않은 코드 및 MSIL은 코드가 무엇인지 이해하지 못하며 CLR에서 실행할 수 없습니다. .NET 언어로 작성되지 않은 .NET 애플리케이션에서 사용한 타사 컨트롤과 같습니다.

0

우선 전에, 이것을 이해 .NET framework, Microsoft같은 독립 실행 형 제품을 제공 한 MFC (Visual C++), VB, FoxPro

2002 년 Microsoft는 자사 제품을 결합하여 .NET 프레임 워크를 만들었습니다. 이제 코드가 이전에 실행 된 방식과 .NET 프레임 워크에서 코드가 관리 및 실행되는 방식에는 차이가 있습니다. Microsoft는 CLR지원되는 .NET 프레임 워크 언어에서 제공되는 코드를 컴파일하고 추가 기능 memory mangement, garbage collection등을 제공하는 .NET 프레임 워크 개념을 도입했습니다 . 그러나 이러한 CLR 기능은 이전에 직접 사용할 수 없었습니다.

따라서 CLR로 컴파일 된 .NET 프레임 워크에서 라이브러리 / 코드를 작성하는 경우이라고 Managed code합니다. 이 라이브러리를 다른 .NET 응용 프로그램 / 프로젝트에서 더 사용할 수 있으며 CLR은 이전에 컴파일 된 방식을 이해하므로 관리 코드로 유지됩니다.

OTOH .NET 프레임 워크 이전에 작성된 라이브러리를 사용하려면 특정 제한 사항을 수행 할 수 있지만 그 당시 CLR이 없기 때문에 CLR 은이 코드를 다시 이해하고 컴파일하지 않습니다. . 그리고 이것을이라고 unmanaged code합니다. CLR 호환이 아닌 경우 특정 기능 / 도구를 제공하기 위해 일부 타사에서 만든 라이브러리 / 어셈블리도 관리 취소 코드로 간주 될 수 있습니다.

평신도 용어로, 코드 관리 는 CLR이 이해하고 추가 실행을 위해 자체적으로 컴파일 할 수있는 것입니다. .NET 프레임 워크에서 (.NET 프레임 워크에서 작동하는 모든 언어에서) 코드가 CLR로 이동하면 코드에서 일부 메타 데이터 정보를 제공하므로 CLR이 여기에 지정된 기능을 제공 할 수 있습니다 . 그들 중 몇 가지는 Garbage collection, Performance improvements, cross-language integration, memory management

관리되지 않는 코드 인 OTOH 는 기계에 특화된 것으로 사용 준비가되어 있으므로 더 이상 처리 할 필요가 없습니다.


많은 정보를 얻지 못한 많은 의견, 나는 두렵다. 놀랍게도 CLR은 관리되지 않는 코드 (보통 C ++ / CLI로 작성)도 실행할 수 있습니다. 또한 관리 코드를 IL로 사용할 필요가 없습니다. .NET Native는 오랫동안 사용되어 왔으며 사전 컴파일 된 어셈블리와 함께 제공됩니다. 당신은 무엇이라고 "CLR 호환하는" 아마 일을 의미한다 "준수 CLS" . CLS 규정을 준수하지 않아도 관리 코드가 관리되지 않는 것은 아닙니다. 설명되지 않더라도 관리되지 않는 코드를 소비하는 것은 COM, P / Invoke, C ++ / CLI 등의 RCW도 매우 쉽습니다.
IInspectable

0

Pro C # 5 및 .NET 4.5 프레임 워크에서 :

관리 코드와 비 관리 코드 : C # 언어에 대해 이해해야 할 가장 중요한 점은 .NET 런타임 내에서만 실행할 수있는 코드를 생성 할 수 있다는 것입니다. C #을 사용하여 네이티브 COM 서버 나 관리되지 않는 C / C ++를 만들 수는 없습니다. 신청). 공식적으로 말하면 .NET 런타임을 대상으로하는 코드를 설명하는 데 사용되는 용어는 관리 코드입니다. 관리되는 코드가 포함 된 이진 단위를 어셈블리라고합니다 (조립품에 대한 자세한 내용은 약간만). 반대로 .NET 런타임에서 직접 호스팅 할 수없는 코드를 관리되지 않는 코드라고합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.