@SlimDX asked on twitter last week:
Dear Windows API Code Pack: I may be mistaken, but your DX types aren't actually disposable from what I saw. What?
Here is a response from a developer on the Code Pack project:
Yes, we do support Dispose() on all of our wrapper types.
At first glance it might not be very obvious how we support it, but here's how:
C++/CLI generates the IDisposable pattern supporting method, Dispose(),.if we implement the equivalent ~ (destructor) on a ref class or struct, which we sometimes do. However, in most cases, I don't have an explicit destructor, instead for almost all ref classes and ref structs , Either I include an auto pointer member by value which implements a finalizer and destructor (desctructor calling into the finalizer code), or inherit from a class that includes that auto pointer.
Then, C++/CLI has this "helpful" feature that it will automatically implement the IDisposable required Dispose() method for us when a type contains an IDisposable member. Meaning, almost all of our exposed types (including all wrapper structs/classes), implement Dispose().
There are two easy ways to use Dispose() in C#:
- Call obj.Dispose() directly, when the obj is no longer needed (Preferably setting it to null afterwards to make sure it's no longer needed), e:.g
Viewport vp = new Viewport();
// Use vp here
vp.Dispose(); // vp destroyed
vp = null;
- Or, use the using(...) keyword, e.g (from one of our samples)
using (Texture2D buffer = swapChain.GetBuffer<Texture2D>(0))
renderTargetView = device.CreateRenderTargetView(buffer, null);
} // buffer.Dispose() will be called here
One look at the reflected code, or our docs, or by using intellisense on a type, will show we implement the Dispose() pattern.
e.g. of reflected code:
public class PassDescription : IDisposable
public override sealed void Dispose();
protected virtual void Dispose(bool __p1);
// Base class for all classes supporting internal IUnknown interfaces
public abstract class DirectUnknown : IDisposable