diff --git a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs index 8279046c..e9c861e2 100644 --- a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs +++ b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs @@ -237,7 +237,7 @@ namespace CppSharp.Generators.CLI WriteLine("};"); } - public void GenerateClassNativeField(Class @class, string nativeType) + internal static bool HasRefBase(Class @class) { Class baseClass = null; @@ -247,13 +247,24 @@ namespace CppSharp.Generators.CLI var hasRefBase = baseClass != null && baseClass.IsRefType && !baseClass.Ignore; - var hasIgnoredBase = baseClass != null && baseClass.Ignore; + return hasRefBase; + } - if (!@class.HasBase || !hasRefBase || hasIgnoredBase) - { - WriteLineIndent("property {0} NativePtr;", nativeType); - NewLine(); - } + public void GenerateClassNativeField(Class @class, string nativeType) + { + if (HasRefBase(@class)) return; + + WriteLineIndent("property {0} NativePtr;", nativeType); + + PushIndent(); + WriteLine("property System::IntPtr Instance"); + WriteStartBraceIndent(); + WriteLine("virtual System::IntPtr get();"); + WriteLine("virtual void set(System::IntPtr instance);"); + WriteCloseBraceIndent(); + NewLine(); + + PopIndent(); } public void GenerateClassGenericMethods(Class @class) @@ -462,11 +473,12 @@ namespace CppSharp.Generators.CLI return true; } - if (@class.HasBase && !@class.IsValueType) - if (!@class.Bases[0].Class.Ignore) - Write(" : {0}", QualifiedIdentifier(@class.Bases[0].Class)); + if (HasRefBase(@class)) + Write(" : {0}", QualifiedIdentifier(@class.Bases[0].Class)); + else if (@class.IsRefType) + Write(" : ICppInstance"); - WriteLine(string.Empty); + NewLine(); WriteLine("{"); WriteLine("public:"); return false; diff --git a/src/Generator/Generators/CLI/CLISourcesTemplate.cs b/src/Generator/Generators/CLI/CLISourcesTemplate.cs index e6a585b8..2d74ad4f 100644 --- a/src/Generator/Generators/CLI/CLISourcesTemplate.cs +++ b/src/Generator/Generators/CLI/CLISourcesTemplate.cs @@ -151,6 +151,26 @@ namespace CppSharp.Generators.CLI if (@class.IsRefType) { + if (!CLIHeadersTemplate.HasRefBase(@class)) + { + PushBlock(CLIBlockKind.Method); + WriteLine("System::IntPtr {0}::Instance::get()", + QualifiedIdentifier(@class)); + WriteStartBraceIndent(); + WriteLine("return System::IntPtr(NativePtr);"); + WriteCloseBraceIndent(); + PopBlock(NewLineKind.BeforeNextBlock); + + PushBlock(CLIBlockKind.Method); + WriteLine("void {0}::Instance::set(System::IntPtr object)", + QualifiedIdentifier(@class)); + WriteStartBraceIndent(); + var nativeType = string.Format("::{0}*", @class.QualifiedOriginalName); + WriteLine("NativePtr = ({0})object.ToPointer();", nativeType); + WriteCloseBraceIndent(); + PopBlock(NewLineKind.BeforeNextBlock); + } + foreach (var field in @class.Fields) { if (ASTUtils.CheckIgnoreField(@class, field))