@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 PassDescription();

 

        ...

        public override sealed void Dispose();

        protected virtual void Dispose(bool __p1);

        ...

    }

 

    // Summary:

    //     Base class for all classes supporting internal IUnknown interfaces

    public abstract class DirectUnknown : IDisposable

    {

        ...

        public override sealed void Dispose();

        protected virtual void Dispose(bool __p1);

        ...

    }