질문)
c# 프로그램을 하다보면, SendMessage와 같은 win32기반의 함수를 사용하는 경우도 있고, 참조를 통한 함수를 사용하는 경우도 있습니다. 두개의 함수가 c# 코드 실행중에 runtime 시에 일어나고 발생된느 원리는 같은가요? 아니면 틀린가요?

답변)
C# 코드에서 SendMessage 같은 Win32 API 함수 호출과, C# 내부(예: .NET 라이브러리)의 함수 호출은 실행 원리(동작 방식)가 근본적으로 다릅니다.


1. Win32 API 호출 (예: SendMessage)

  • C#에서 Win32 API 함수를 호출하려면 **P/Invoke(Platform Invocation Services)**를 사용합니다.
  • P/Invoke는 C# (관리 코드, Managed Code)에서 비관리 코드(Unmanaged Code, 네이티브 DLL 함수)를 호출하는 기술입니다.
  • 런타임 시 C#에서 선언한 함수 시그니처를 바탕으로, 내부적으로는 네이티브 DLL(예: user32.dll)의 SendMessage 함수 주소를 찾고 호출합니다.
  • 호출 과정에서 호출 스택 전환, 데이터 타입 마샬링(Managed <-> Unmanaged) 등이 일어납니다.

즉,

  • C# → (P/Invoke) → Win32 네이티브 함수 호출 → Win32 함수 실행 → 결과 반환 → C#에 반환

2. C# 참조를 통한 함수 호출

  • C# 내에서 직접 참조한 클래스/메서드 호출은 **모든 코드가 관리 코드(Managed Code)**로 실행됩니다.
  • JIT(Just-In-Time) 컴파일러가 IL(Intermediate Language)을 네이티브 코드로 변환하여 CPU에서 직접 실행합니다.
  • 호출은 .NET 런타임 환경에서 이뤄지고, 스택, 레지스터 등 CPU 자원 관리는 CLR이 담당합니다.
  • 데이터 타입 변환이나 스택 전환 과정이 필요 없거나 매우 단순합니다.

즉,

  • C# → (JIT 컴파일) → 네이티브 코드 실행 → 결과 반환

결론

구분Win32 API 호출 (SendMessage)C# 내부 함수 호출
코드 실행 영역 네이티브 (Unmanaged) 영역 관리(Managed) 영역
호출 방식 P/Invoke를 통한 네이티브 함수 호출 일반 메서드 호출
런타임 동작 스택 전환, 데이터 마샬링 필요 CLR 관리 하에 직접 실행
성능 영향 호출 오버헤드 다소 있음 상대적으로 빠름
안전성 네이티브 호출 오류 시 문제 가능 CLR의 메모리 안전성 보장

+ Recent posts