답변:
관리되지 않는 코드 에 대한 MSDN의 일부 텍스트는 다음과 같습니다 .
일부 라이브러리 코드는 관리되지 않는 코드 (예 : Win32와 같은 기본 코드 API)를 호출해야합니다. 이는 관리 코드의 보안 경계 외부로 나가는 것을 의미하므로주의해야합니다.
관리 코드에 대한 다른 무료 설명은 다음과 같습니다.
문제의 경우 :
NUnit이 UnitTesting을 위해 코드를 실행하고 관리되지 않는 부분이있을 수 있다고 생각합니다. 그러나 나는 그것에 대해 확신하지 못하므로 금으로 가져 가지 마십시오. 누군가가 당신에 대해 더 많은 정보를 줄 수 있다고 확신합니다. 그것이 도움이되기를 바랍니다!
이것은 주제에 관한 좋은 기사입니다.
요약,
동일한 머신에 설치된 런타임 엔진 내에서 실행되는 애플리케이션 프로그램입니다. 응용 프로그램이 없으면 응용 프로그램을 실행할 수 없습니다. 런타임 환경은 프로그램이 사용하고 일반적으로 메모리 관리를 수행하는 일반 소프트웨어 루틴 라이브러리를 제공합니다. 또한 소스 코드에서 실행 코드로 또는 중간 언어에서 실행 코드로 JIT (just-in-time) 변환을 제공 할 수 있습니다. Java, Visual Basic 및 .NET의 CLR (공용 언어 런타임)은 런타임 엔진의 예입니다. ( 더 읽기 )
자체적으로 실행되는 실행 프로그램. 운영 체제에서 시작된 프로그램은 운영 체제의 소프트웨어 루틴을 호출하고 사용하지만 다른 소프트웨어 시스템을 사용할 필요는 없습니다. 특정 플랫폼을위한 기계 언어로 조립 및 C / C ++ 프로그램을 기계어로 컴파일 된 어셈블리 언어 프로그램은 관리되지 않는 코드의 예입니다. ( 자세히보기 )
비 관리 형 을 생각할 때는 기계 별 기계 수준 코드를 생각하십시오. x86 어셈블리 언어와 같습니다. 관리되지 않는 (네이티브) 코드는 컴파일되고 링크되어 현재 설계된 모든 프로세서를 제외하고 설계된 프로세서에서 직접 실행됩니다. 휴대용이 아니지만 빠릅니다. 매우 간단하고 제거 된 코드입니다.
관리되는 코드는 Java에서 기존 Interpretive BASIC 또는 .NET에서 실행되는 모든 것입니다. 관리 코드는 일반적으로 중간 레벨 P- 코드 또는 바이트 코드 세트로 컴파일됩니다. 이 지침은 어셈블리 언어와 비슷하지만 기계 별 지침은 아닙니다. 관리 코드는 프로그램이 실행되는 시스템에서 프로그램을 격리하고 모든 메모리가 간접적으로 할당되는 안전한 경계를 만들고 일반적으로 포트, 메모리 주소 공간, 스택 등과 같은 시스템 리소스에 직접 액세스 할 수 없습니다 보다 안전한 환경에서 실행하는 것이 좋습니다.
관리되는 변수를 관리되지 않는 변수로 변환하려면 실제 개체 자체에 도달해야합니다. 추가 포장으로 포장되거나 포장되어있을 수 있습니다. 32 비트 시스템에서 관리되지 않는 변수 (예 : 'int'와 같은)는 정확히 4 바이트를 사용합니다. 오버 헤드 또는 추가 패키징이 없습니다. 관리되는 코드에서 관리되지 않는 코드로 돌아가는 과정을 " 마샬링 "이라고합니다. 프로그램이 경계를 넘을 수 있습니다.
관리 코드 :
공용 언어 런타임과 "협력 계약"하에서 실행 되는 코드 입니다. 관리 코드는 메모리 관리, 언어 간 통합, 코드 액세스 보안 및 자동 객체 수명 제어와 같은 서비스를 제공하기 위해 런타임에 필요한 메타 데이터를 제공해야합니다. MSIL (Microsoft Intermediate Language)을 기반으로하는 모든 코드는 관리 코드로 실행됩니다.관리되지 않는 코드 :
공용 언어 런타임의 규칙 및 요구 사항에 관계없이 만들어진 코드입니다. 관리되지 않는 코드는 최소한의 서비스 (예 : 가비지 수집 없음, 디버깅 제한 등)로 공용 언어 런타임 환경에서 실행됩니다.
참조 : http://www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx
우선 전에, 이것을 이해 .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 는 기계에 특화된 것으로 사용 준비가되어 있으므로 더 이상 처리 할 필요가 없습니다.
Pro C # 5 및 .NET 4.5 프레임 워크에서 :
관리 코드와 비 관리 코드 : C # 언어에 대해 이해해야 할 가장 중요한 점은 .NET 런타임 내에서만 실행할 수있는 코드를 생성 할 수 있다는 것입니다. C #을 사용하여 네이티브 COM 서버 나 관리되지 않는 C / C ++를 만들 수는 없습니다. 신청). 공식적으로 말하면 .NET 런타임을 대상으로하는 코드를 설명하는 데 사용되는 용어는 관리 코드입니다. 관리되는 코드가 포함 된 이진 단위를 어셈블리라고합니다 (조립품에 대한 자세한 내용은 약간만). 반대로 .NET 런타임에서 직접 호스팅 할 수없는 코드를 관리되지 않는 코드라고합니다.