![]() |
Languages »
C# »
Memory Management
Intermediate
License: The Code Project Open License (CPOL)
Pinned ObjectBy Marc CliftonA helper class for working with structures that need to be pinned to prevent the GC from moving them. |
C# 2.0, .NET, Win2K, WinXP, Win2003, VistaVS2005, Dev
|
|
Advanced Search |
|
|
|
||||||||||||||||
This article describes a very short helper class to work with unmanaged memory that must be pinned to prevent the garbage collector from moving it. This is a particular requirement when working with the Win32 API's asynchronous I/O methods, which I found myself doing when implementing a USB device interface.
There is no download; simply copy the code from this article--please do not remove the copyright.
There really isn't much to this code:
Here's the code:
// (c) 2007 Marc Clifton using System; using System.Runtime.InteropServices; namespace Clifton.Tools.Interop { /// <summary> /// A helper class for pinning a managed structure so that it is suitable for /// unmanaged calls. A pinned object will not be collected and will not be moved /// by the GC until explicitly freed. /// </summary> public class PinnedObject<T> : IDisposable where T : struct { protected T managedObject; protected GCHandle handle; protected IntPtr ptr; protected bool disposed; public T ManangedObject { get { return (T)handle.Target; } set { Marshal.StructureToPtr(value, ptr, false); } } public IntPtr Pointer { get { return ptr; } } public PinnedObject() { handle = GCHandle.Alloc(managedObject, GCHandleType.Pinned); ptr = handle.AddrOfPinnedObject(); } ~PinnedObject() { Dispose(); } public void Dispose() { if (!disposed) { handle.Free(); ptr = IntPtr.Zero; disposed = true; } } } }
This example illustrates manipulating a PinnedObject using C++ style pointer syntax within an unsafe code block. The code illustrates:
using System; using Clifton.Tools.Interop; namespace pintest { public struct TestStruct { public int a; } public static class Test { public static void Main() { PinnedObject<TestStruct> pin = new PinnedObject<TestStruct>(); TestStruct ts = new TestStruct(); ts.a = 1; pin.ManangedObject = ts; unsafe { TestStruct* p = (TestStruct*)pin.Pointer; ++p->a; } Console.WriteLine(pin.ManangedObject.a); } } }
A simple class but hopefully you will find it useful for the strong type management and functionality that it encapsulates.
| You must Sign In to use this message board. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 11 Feb 2007 Editor: J. Dunlap |
Copyright 2007 by Marc Clifton Everything else Copyright © CodeProject, 1999-2009 Web15 | Advertise on the Code Project |