Transcript 1.C# C

Managed code와
Unmanaged code
김진태
Managed code 란 ?
•
Manage code란 Visual Basic .NET과 C# 컴파일러, JAVA 컴파일러가 만
들어내는 IL(Intermediate Language – 중간 언어) 코드 혹은 byte
code( java의 경우)이다.
– Viusal C++의 경우는 Unmanaged code와 Managed code 둘 다 생성 가능하다.
•
IL 코드(byte code)는 machine 코드처럼 바로 실행되는 코드가 아니라
CLR(Common Language Runtime)환경에서 동작한다.
– java의 경우 JVM( java virtual machine)
•
CLR은 현재 프로그램(IL)이 돌아가는 컴퓨터의 환경에 적합한 기계 언어
를 실행 시간에 만들어 낸다.
•
CLR은 보안, 메모리 관리, 스레딩에 관련된 서비스 일체를 제공한다.
•
그러므로 Managed Code는 .NET framework 혹은 JVM이 있는 환경에
서만 동작 가능하다.
Unmanaged code 란 ?
•
Unmanaged code는 통상적으로 우리가 알고 있는 Native code를 말한다.
•
Managed code와 달리 중간 코드를 생성하지 않고 바로 기계 코드를 생성
한다.
–
단, Managed code와 달리 실행환경이 아닌 컴파일 환경에 적합한 기계 코드가 생성된다.
•
이러한 이유로 Managed Code에서 생성된 기계코드는 하드웨어와 OS가
다른 환경에서는 실행될 수 없다.
•
또한, 실행시에 보안 및 메모리 관리 서비스를 받을 수 있는 Managed
Code와 달리 Unmanaged code는 스스로 모든 것을 처리해야 한다.
•
Visual C++은 Microsoft의 언어들 중 유일하게 Unmanaged code를 만들
수 있다.
비교
Managed Code
Unmanaged Code
언어
VB, C#, java, managed C++
Native C++
메모리 관리
보안
쓰레드 관리
CLR, JVM
OS, 직접
-Managed Code의 경우 별도의 GC가 메모리 관리를 해주게 되는 데 이는 각각의 code의 장점과 단점을 발생시
킨다.
-Managed Code는 GC로 인해 메모리 관리가 쉽고 메모리 누수가 발생하지 않지만 그로 인해 수행 속도가
비교적 느려지는 단점이 발생한다.
-Unmanaged Code는 메모리 관리를 직접 해주어야 하므로 비교적 개발난이도가 발생하지만 수행속도가
비교적 빠르다는 장점이 있다.
- Managed Code의 경우 CLR혹은 JVM으로 인해 Platform Free하다는 장점이 있지만 이는 오히려 단점으로 나타
나는 경우도 있고 개발 분야에 따라 그 효용성이 나뉘므로 CLR 혹은 JVM을 사용하는 것이 더 좋다고 할 수는 없
다고 생각한다.
C#에서 C++ Function 호출
•
•
C#에서 DLLImport 를 사용하여 C++의 dll을 로딩
C#코드
using System.Runtime.InteropServices; // DLLImport를 사용하기 위한 namespace
namespace ConsoleApplication
{
class Program
{
}
•
}
[DllImport(“test.dll”)]
public static extern int fntext3();
// c++ function과 같은 type으로 선언한다.
static void Main(string[] args]
{
Console.write(fntest3());
}
C++코드
extern “C” __declspec(dllexport) int fntest3(void)
{
return 10;
}
※ extern “C” 키워드가 없을 경우 함수 이름이 변형되므로 C#에서 사용이 불가능하다.
C#에서 C++ Class 사용
•
•
C#에서는 바로 Native C++의 클래스를 사용할 수 없으므로 중간 과정이 필요하다.
Native C++ → Managed C++ → C#
–
Native C++을 정적 라이브러리로 만든다.
–
Managed C++에서 라이브러리를 로드하여 Native C++의 컴포넌트를 사용하는 wrapper 클
래스를 구현한 DLL을 생성한다.
C#에서 사용하기 위해
ref 키워드를 사용한다.
Managed C++을 사용하기 위해 CLR 옵션을 킨다..
–
C#에서 생성된 DLL을 참조하여 Wrapper 클래스를 사용한다.
Managed Code에서 사용되기
위해 동적 할당 방식으로 사용
되야 한다.
참조
• http://tang2.tistory.com/entry/C에서-C-호
출하기
• http://kindtis.tistory.com/66