From 136582fc6b9fe3f7788c12fe4b4e1b03ee293696 Mon Sep 17 00:00:00 2001 From: triton Date: Mon, 8 Apr 2013 23:41:21 +0100 Subject: [PATCH] Improve the generation of the Dispose() pattern. --- .../Generators/CSharp/CSharpTextTemplate.cs | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index ec96b60e..10c5a156 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -596,16 +596,44 @@ namespace Cxxi.Generators.CSharp } if (@class.IsRefType) + GenerateDisposeMethods(@class); + } + + private void GenerateDisposeMethods(Class @class) + { + var hasBaseClass = @class.HasBaseClass && @class.BaseClass.IsRefType; + + // Generate the IDispose Dispose() method. + if (!hasBaseClass) { + NewLineIfNeeded(); WriteLine("public void Dispose()"); WriteStartBraceIndent(); - if (ShouldGenerateClassNativeField(@class)) - WriteLine("Marshal.FreeHGlobal(Instance);"); + WriteLine("Dispose(disposing: true);"); + WriteLine("GC.SuppressFinalize(this);"); WriteCloseBraceIndent(); NewLine(); } + + // Generate Dispose(bool) method + NewLineIfNeeded(); + Write("protected "); + + Write(hasBaseClass ? "override " : "virtual "); + + WriteLine("void Dispose(bool disposing)"); + WriteStartBraceIndent(); + + if (ShouldGenerateClassNativeField(@class)) + WriteLine("Marshal.FreeHGlobal(Instance);"); + + if (hasBaseClass) + WriteLine("base.Dispose(disposing);"); + + WriteCloseBraceIndent(); + NeedNewLine(); } private void GenerateNativeConstructor(Class @class)