diff --git a/src/Generator/Generators/CSharp/CSharpSources.cs b/src/Generator/Generators/CSharp/CSharpSources.cs index d13b0324..79ba9ccd 100644 --- a/src/Generator/Generators/CSharp/CSharpSources.cs +++ b/src/Generator/Generators/CSharp/CSharpSources.cs @@ -2257,13 +2257,15 @@ namespace CppSharp.Generators.CSharp // The local var must be of the exact type in the object map because of TryRemove WriteLine("NativeToManagedMap.TryRemove({0}, out _);", Helpers.InstanceIdentifier); - var classInternal = TypePrinter.PrintNative(@class); - if (@class.IsDynamic && GetUniqueVTableMethodEntries(@class).Count != 0) + var realClass = @class.IsTemplate ? @class.Specializations[0] : @class; + var classInternal = TypePrinter.PrintNative(realClass); + if (@class.IsDynamic && GetUniqueVTableMethodEntries(realClass).Count != 0) { - ClassLayout layout = (@class.IsDependent ? @class.Specializations[0] : @class).Layout; - for (var i = 0; i < layout.VTablePointers.Count; i++) - WriteLine($@"(({classInternal}*) {Helpers.InstanceIdentifier})->{ - layout.VTablePointers[i].Name} = __VTables.Tables[{i}];"); + for (int i = 0; i < realClass.Layout.VTablePointers.Count; i++) + { + var offset = realClass.Layout.VTablePointers[i].Offset; + WriteLine($"*(IntPtr*)({Helpers.InstanceIdentifier} + {offset}) = __VTables.Tables[{i}];"); + } } } diff --git a/tests/CSharp/CSharp.Tests.cs b/tests/CSharp/CSharp.Tests.cs index 6c467db6..8c0e71d2 100644 --- a/tests/CSharp/CSharp.Tests.cs +++ b/tests/CSharp/CSharp.Tests.cs @@ -1128,6 +1128,15 @@ public unsafe class CSharpTests bool b = true; Assert.That(*virtualTemplate.Function(ref b), Is.EqualTo(true)); } + using (var virtualTemplate = new VirtualDependentValueFields()) + { + } + using (var virtualTemplate = new VirtualDependentValueFields()) + { + } + using (var virtualTemplate = new VirtualDependentValueFields()) + { + } } [Test] diff --git a/tests/CSharp/CSharpTemplates.cpp b/tests/CSharp/CSharpTemplates.cpp index 898454e8..8c383430 100644 --- a/tests/CSharp/CSharpTemplates.cpp +++ b/tests/CSharp/CSharpTemplates.cpp @@ -114,7 +114,9 @@ void forceUseSpecializations(IndependentFields _1, IndependentFields IndependentFields> _15, DependentPointerFields _16, IndependentFields _17, TemplateWithIndexer _18, IndependentFields _19, - TemplateWithIndexer _20, std::string s) + TemplateWithIndexer _20, VirtualDependentValueFields _21, + VirtualDependentValueFields _22, VirtualDependentValueFields _23, + std::string s) { } diff --git a/tests/CSharp/CSharpTemplates.h b/tests/CSharp/CSharpTemplates.h index 6dc19710..21c34a79 100644 --- a/tests/CSharp/CSharpTemplates.h +++ b/tests/CSharp/CSharpTemplates.h @@ -543,6 +543,27 @@ T* VirtualTemplate::function(T* t) return t; } +template +class VirtualDependentValueFields +{ +public: + VirtualDependentValueFields(); + virtual ~VirtualDependentValueFields(); + +private: + T t; +}; + +template +VirtualDependentValueFields::VirtualDependentValueFields() +{ +} + +template +VirtualDependentValueFields::~VirtualDependentValueFields() +{ +} + class DLL_API HasVirtualTemplate { public: @@ -768,7 +789,9 @@ void forceUseSpecializations(IndependentFields _1, IndependentFields IndependentFields> _15, DependentPointerFields _16, IndependentFields _17, TemplateWithIndexer _18, IndependentFields _19, - TemplateWithIndexer _20, std::string s); + TemplateWithIndexer _20, VirtualDependentValueFields _21, + VirtualDependentValueFields _22, VirtualDependentValueFields _23, + std::string s); void hasIgnoredParam(DependentValueFields> ii);