using System; using System.Runtime.InteropServices; namespace MMDeploy { /// /// Base class which manages its own memory. /// public class DisposableObject : IDisposable { #pragma warning disable SA1401 // Fields should be private /// /// Handle pointer. /// protected IntPtr _handle; #pragma warning restore SA1401 // Fields should be private private bool _disposed = false; /// /// Gets a value indicating whether this instance has been disposed. /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } /// /// Close handle. /// public void Close() { Dispose(); } /// /// Releases the resources. /// private void Dispose(bool disposing) { if (_disposed) { return; } if (disposing) { // Free any other managed objects here. ReleaseManaged(); } // Free any unmanaged objects here. ReleaseHandle(); _handle = IntPtr.Zero; _disposed = true; } /// /// Releases managed resources. /// protected virtual void ReleaseManaged() { } /// /// Releases unmanaged resources. /// protected virtual void ReleaseHandle() { Marshal.FreeHGlobal(_handle); } /// /// Finalizes an instance of the class. /// ~DisposableObject() { Dispose(false); } /// /// Throw exception is result is not zero. /// /// function return value. protected static void ThrowException(int result) { if (result != 0) { throw new Exception(result.ToString()); } } } }