728x90
반응형
728x170
■ GCHandle 클래스를 사용하는 기본적인 방법을 보여준다.
▶ 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
반응형
그리드형(광고전용)
댓글을 달아 주세요