C# Academy · 강의

상호 운용 기초(P/Invoke) 한눈에 보기

P/Invoke로 네이티브 함수를 호출합니다. DllImport 기초, 문자열 마샬링, SetLastError, 간단한 Win32 예제(Sleep, GetTickCount64)를 다룹니다.

레슨 2/38개 단계

상호 운용 기초(P/Invoke) 한눈에 보기은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 3개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

개념 및 목표

P/Invoke를 사용하면 C#에서 네이티브 DLL의 함수를 호출할 수 있습니다.

  • DllImport를 사용하여 메서드를 연결합니다
  • 필요한 경우 CharSet과 SetLastError를 선택합니다
  • 시그니처는 간단하고 정확하게 유지합니다

P/Invoke: Sleep

DllImport를 사용하여 관리되는 메서드를 선언함으로써 네이티브 함수를 연결하세요.

using System;
using System.Runtime.InteropServices;

// Simple P/Invoke call to native Sleep (Windows kernel32)
// Note: This demo may only run on Windows, but it compiles everywhere.
public class Program
{
  [DllImport("kernel32.dll")]
  private static extern void Sleep(uint dwMilliseconds);

  public static void Main(string[] args)
  {
    Console.WriteLine("Sleeping for 200 ms...");
    // Call native function
    Sleep(200);
    Console.WriteLine("Awake!");
  }
}

네이티브 반환 값

네이티브 시그니처와 일치시키세요. 여기서는 부호 없는 64비트 값을 반환합니다.

using System;
using System.Runtime.InteropServices;

// Get system uptime (ms) from native function.
public class Program
{
  [DllImport("kernel32.dll")]
  private static extern ulong GetTickCount64();

  public static void Main(string[] args)
  {
    ulong ms = GetTickCount64();
    Console.WriteLine("Uptime (ms): " + ms);
  }
}

문자열 및 CharSet

와이드 문자열 인터페이스(“W” 버전)에는 CharSet.Unicode를 사용하세요. 지원되지 않는 플랫폼에서는 런타임 오류를 처리하세요.

using System;
using System.Runtime.InteropServices;

// Demo: marshaling strings to Unicode with CharSet.Unicode.
// On non-Windows environments this may fail at runtime.
public class Program
{
  [DllImport("user32.dll", CharSet = CharSet.Unicode)]
  private static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type);

  public static void Main(string[] args)
  {
    Console.WriteLine("Calling MessageBox (may require Windows GUI)...");
    // 0x00000040 = MB_ICONINFORMATION
    try
    {
      int result = MessageBox(IntPtr.Zero, "Hello from P/Invoke", "Interop", 0x00000040);
      Console.WriteLine("MessageBox returned: " + result);
    }
    catch (Exception ex)
    {
      Console.WriteLine("MessageBox failed at runtime: " + ex.GetType().Name);
    }
  }
}

SetLastError 및 형식

오류 처리:

  • GetLastError를 설정하는 인터페이스에는 DllImport에 SetLastError=true를 추가하세요
  • 호출이 실패한 후 Marshal.GetLastWin32Error()를 읽으세요
  • 정확한 형식을 우선 사용하세요. uint와 int를 구분하고 포인터에는 IntPtr를 사용합니다

상호 운용성 관리

  • 간단한 인터페이스부터 시작하세요(복잡한 구조체는 피함)
  • 핸들에는 IntPtr를 사용하고 올바른 네이티브 함수로 해제하세요
  • 헤드리스 환경에서는 GUI 호출을 피하세요
  • 플랫폼 제한 사항을 문서화하세요(Windows 전용 등)

DllImport의 목적

빠른 확인: P/Invoke에서 DllImport 특성은 어떤 역할을 하나요?

복습

복습: DllImport로 네이티브 호출을 선언하고, 형식을 신중하게 일치시키며, 문자열에는 CharSet을 선택하세요. 해당하는 경우 SetLastError와 GetLastError를 통해 오류를 처리하세요.

무료로 시작

AI 튜터와 함께 C#을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
93
레슨
346

자주 묻는 질문

“상호 운용 기초(P/Invoke) 한눈에 보기” 강의는 무료인가요?

네 — “상호 운용 기초(P/Invoke) 한눈에 보기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

“상호 운용 기초(P/Invoke) 한눈에 보기”에서 뭘 배우나요?

P/Invoke로 네이티브 함수를 호출합니다. DllImport 기초, 문자열 마샬링, SetLastError, 간단한 Win32 예제(Sleep, GetTickCount64)를 다룹니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 3개 중 2번째 강의입니다.

“상호 운용 기초(P/Invoke) 한눈에 보기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. C# 스크립팅(dotnet script), 코드 조각과 REPL
  2. 상호 운용 기초(P/Invoke) 한눈에 보기
  3. CLI 사용성
← C# Academy(으)로 돌아가기