[C# WPF] namespace System.Runtime.InteropServices의 Marshal클래스

Doyeon Noh·2024년 11월 25일

Marshal 클래스는 C#에서 관리되지 않는 메모리와 관련된 작업을 수행하는 데 사용됩니다. 주로 P/Invoke(Platform Invocation Services)와 COM(구성 요소 개체 모델)과 같은 관리되지 않는 코드와 상호 작용할 때 필요합니다. 이 클래스를 사용하면 관리되는 코드(C#)와 관리되지 않는 코드(C/C++) 간의 데이터 전송이나 메모리 관리를 효율적으로 수행할 수 있습니다.

1. 관리되는 메모리 vs. 관리되지 않는 메모리

  • 관리되는 메모리: C#과 같은 고급 언어에서 자동으로 메모리가 관리되는 영역입니다. .NET 런타임(가비지 컬렉터)이 메모리를 할당하고 해제합니다. 개발자는 메모리 관리에 대해 걱정할 필요가 없습니다.

  • 관리되지 않는 메모리: C/C++와 같은 저수준 언어에서 직접 메모리를 할당하고 해제해야 하는 영역입니다. 개발자가 메모리 관리를 직접 처리해야 하므로 메모리 누수나 잘못된 메모리 접근 같은 문제가 발생할 수 있습니다.

2. Marshal 클래스

Marshal 클래스는 다음과 같은 주요 기능을 제공합니다:

1. 메모리 할당 및 해제

  • Marshal.AllocHGlobal: 관리되지 않는 메모리를 할당합니다. 이 메서드는 필요한 바이트 수를 인수로 받아, 해당 크기의 메모리를 할당하고 포인터를 반환합니다.

    IntPtr unmanagedPointer = Marshal.AllocHGlobal(size);
  • Marshal.FreeHGlobal: AllocHGlobal로 할당한 메모리를 해제합니다.

    Marshal.FreeHGlobal(unmanagedPointer);

2. 데이터 복사

  • Marshal.Copy: 관리되는 배열과 관리되지 않는 메모리 간에 데이터를 복사합니다. 예를 들어, 관리되는 배열의 데이터를 관리되지 않는 메모리에 복사하거나 그 반대의 작업을 수행할 수 있습니다.

    Marshal.Copy(managedArray, 0, unmanagedPointer, managedArray.Length);

3. 구조체와 메모리 간의 변환

  • Marshal.PtrToStructure: 관리되지 않는 메모리에서 구조체로 데이터를 복사합니다.

    MyStruct myStruct = Marshal.PtrToStructure<MyStruct>(unmanagedPointer);
  • Marshal.StructureToPtr: 구조체의 데이터를 관리되지 않는 메모리로 복사합니다.

    Marshal.StructureToPtr(myStruct, unmanagedPointer, false);

3. 예시

다음은 Marshal 클래스를 사용하여 관리되지 않는 메모리를 할당하고 해제하는 간단한 예시입니다.

using System;
using System.Runtime.InteropServices;

class Program
{
    [StructLayout(LayoutKind.Sequential)]
    struct MyData
    {
        public int Number;
        public float Value;
    }

    static void Main()
    {
        // 관리되지 않는 메모리 할당
        IntPtr unmanagedPointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(MyData)));

        try
        {
            // 구조체 초기화
            MyData data = new MyData { Number = 42, Value = 3.14f };

            // 구조체를 관리되지 않는 메모리로 복사
            Marshal.StructureToPtr(data, unmanagedPointer, false);

            // 메모리에서 구조체로 복사
            MyData retrievedData = Marshal.PtrToStructure<MyData>(unmanagedPointer);
            Console.WriteLine($"Number: {retrievedData.Number}, Value: {retrievedData.Value}");
        }
        finally
        {
            // 메모리 해제
            Marshal.FreeHGlobal(unmanagedPointer);
        }
    }
}

요약

  • Marshal 클래스는 C#에서 관리되지 않는 메모리와 상호작용하는 데 필요한 메서드를 제공합니다.
  • 메모리 할당, 해제, 데이터 복사, 구조체 변환 등의 기능을 지원하여 관리되는 코드와 관리되지 않는 코드 간의 원활한 데이터 전송을 가능하게 합니다.
  • 이러한 기능은 주로 P/Invoke, COM 객체와의 통신 등에서 사용됩니다.

추가적인 질문이나 더 알고 싶은 내용이 있으시면 말씀해 주세요!

이런 자료를 참고했어요.
[1] 티스토리 - Chapter 11. 추상 데이터 타입 정리 - dev & log - 티스토리 (https://woo-dev.tistory.com/49)
[2] Medium - 자바스크립트의 메모리 관리 (https://medium.com/@2kunhee94/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-f59500b97873)
[3] 델마당 - [답변]] PByte 변수에 어떤 값을 Assign 하려면 (http://www.delmadang.com/community/bbs_view.asp?bbsNo=17&bbsCat=0&indx=345169&page=3892)
[4] 티스토리 - realloc, calloc 함수 및 예제 - 요우의 내맘대로 블로그 - 티스토리 (https://luckyyowu.tistory.com/11)
[5] 네이버 블로그 - C언어 정리하기 - 동적 할당은 조심히! : 네이버 블로그 (http://m.blog.naver.com/ruvendix/220905891439)
[6] 티스토리 - 메모리 관리 전략, 가상메모리 - 조규진의 스터디 블로그 (https://chogyujin-study.tistory.com/10)
[7] F-Lab - 프로그래밍 면접에서 스택과 힙의 차이점 이해하기 (https://f-lab.kr/insight/understanding-stack-and-heap)
[8] 티스토리 - 메모리 동적 할당 및 관리 - 독하게 시작하는 C프로그래밍 (https://js0331.tistory.com/21)
[9] 티스토리 - 11. 주기억장치 할당 기법 - Change Developer - 티스토리 (https://carnival.tistory.com/m/226)
[10] 티스토리 - C/C++ malloc, free를 사용한 메모리 할당 및 해제(1차원, 2차원 ... (https://hijuworld.tistory.com/59)

뤼튼 사용하러 가기 > https://agent.wrtn.ai/5xb91l

profile
C# 신입개발자

0개의 댓글