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());
}
}
}
}