Skip to content

Instantly share code, notes, and snippets.

@sheastrickland
Created September 7, 2015 06:22
Show Gist options
  • Save sheastrickland/951fcb0e89e68f2c355d to your computer and use it in GitHub Desktop.
Save sheastrickland/951fcb0e89e68f2c355d to your computer and use it in GitHub Desktop.
Landlord: The Com Destroyer. A simple utility class to wrap those nasty little devils.
using System;
using System.Runtime.InteropServices;
namespace Things
{
public static class LandLordExtensions
{
public static LandLord<TWrapped> AsDisposable<TWrapped>(this TWrapped tenant)
{
return new LandLord<TWrapped>(tenant);
}
}
public class LandLord<TWrapped> : IDisposable
{
public TWrapped Tenant { get; private set; }
private bool _disposed;
public LandLord(TWrapped tenant)
{
_disposed = false;
Tenant = tenant;
}
protected virtual void Evict(bool byManagement)
{
try
{
if (_disposed) return;
if (byManagement)
{
using (Tenant as IDisposable){}
}
if (Tenant != null && Marshal.IsComObject(Tenant))
{
Marshal.ReleaseComObject(Tenant);
Tenant = default(TWrapped);
}
}
finally
{
_disposed = true;
}
}
public void Dispose()
{
Evict(byManagement: true);
GC.SuppressFinalize(this);
}
~LandLord()
{
Evict(byManagement: false);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment