Windows 7 API Code Pack for .NET Framework: DX Types are disposable; explanation. #Win7 #CodePack #vs

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