첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

■ GCHandle 클래스를 사용하는 기본적인 방법을 보여준다.

TestProject.zip
0.00MB

▶ AutoPinner.cs

using System.Runtime.InteropServices;

namespace TestProject;

/// <summary>
/// 자동 고정기
/// </summary>
public class AutoPinner : IDisposable
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Field
    ////////////////////////////////////////////////////////////////////////////////////////// Private

    #region Field

    /// <summary>
    /// GC 핸들
    /// </summary>
    private GCHandle gcHandle;

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 생성자 - AutoPinner(source)

    /// <summary>
    /// 생성자
    /// </summary>
    /// <param name="source">소스 객체</param>
    public AutoPinner(object source)
    {
        this.gcHandle = GCHandle.Alloc(source, GCHandleType.Pinned);
    }

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Method
    ////////////////////////////////////////////////////////////////////////////////////////// Static
    //////////////////////////////////////////////////////////////////////////////// Public

    #region IntPtr 암시적 변환하기 - IntPtr(autoPinner)

    /// <summary>
    /// IntPtr 암시적 변환하기
    /// </summary>
    /// <param name="autoPinner">자동 고정기</param>
    public static implicit operator IntPtr(AutoPinner autoPinner)
    {
        return autoPinner.gcHandle.AddrOfPinnedObject();
    }

    #endregion

    ////////////////////////////////////////////////////////////////////////////////////////// Instance
    //////////////////////////////////////////////////////////////////////////////// Public

    #region 리소스 해제하기 - Dispose()

    /// <summary>
    /// 리소스 해제하기
    /// </summary>
    public void Dispose()
    {
        this.gcHandle.Free();
    }

    #endregion
}

 

▶ Student.cs

namespace TestProject;

/// <summary>
/// 학생
/// </summary>
public struct Student
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Property
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region ID - ID

    /// <summary>
    /// ID
    /// </summary>
    public int ID { get; set; }

    #endregion
}

 

▶ Program.cs

using System.Runtime.InteropServices;

namespace TestProject;

/// <summary>
/// 프로그램
/// </summary>
class Program
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Method
    ////////////////////////////////////////////////////////////////////////////////////////// Static
    //////////////////////////////////////////////////////////////////////////////// Private

    #region 프로그램 시작하기 - Main()

    /// <summary>
    /// 프로그램 시작하기
    /// </summary>
    private static void Main()
    {
        Student sourceStudent = new()
        {
            ID = 100
        };

        using(AutoPinner autoPinner = new AutoPinner(sourceStudent))
        {
            IntPtr sourceHandle = autoPinner;

            Student targetStudent = Marshal.PtrToStructure<Student>(sourceHandle);

            Console.WriteLine(targetStudent.ID);
        }
    }

    #endregion
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요