Udostępnij za pośrednictwem


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

...

}

Comments