diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index fd9bd2b9..61f3eb41 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -1479,7 +1479,7 @@ namespace CppSharp.Generators.CSharp for (int i = 0; i < method.Parameters.Count; i++) { var param = method.Parameters[i]; - if (!param.IsGenerated) + if (!param.IsGenerated && param.GenerationKind != GenerationKind.Link) continue; if (param.Kind == ParameterKind.IndirectReturnType) @@ -1506,7 +1506,7 @@ namespace CppSharp.Generators.CSharp if (hasReturn) Write("var {0} = ", Helpers.ReturnIdentifier); - if (method.IsGenerated) + if (method.IsGenerated || method.GenerationKind == GenerationKind.Link) { WriteLine("{0}.{1}({2});", Helpers.TargetIdentifier, method.Name, string.Join(", ", marshals)); diff --git a/src/Generator/Passes/FindSymbolsPass.cs b/src/Generator/Passes/FindSymbolsPass.cs index 12c4dfc6..df445a89 100644 --- a/src/Generator/Passes/FindSymbolsPass.cs +++ b/src/Generator/Passes/FindSymbolsPass.cs @@ -15,7 +15,8 @@ namespace CppSharp.Passes var mangledDecl = decl as IMangledDecl; var method = decl as Method; - if (mangledDecl != null && !(method != null && (method.IsPure || method.IsSynthetized)) && + if (decl.IsGenerated && mangledDecl != null && + !(method != null && (method.IsPure || method.IsSynthetized)) && !VisitMangledDeclaration(mangledDecl)) { decl.ExplicitlyIgnore(); diff --git a/tests/NamespacesBase/NamespacesBase.cpp b/tests/NamespacesBase/NamespacesBase.cpp index 171e71cc..da65d232 100644 --- a/tests/NamespacesBase/NamespacesBase.cpp +++ b/tests/NamespacesBase/NamespacesBase.cpp @@ -27,3 +27,12 @@ Base2::Base2(int i) : Base(i) void Base2::parent(int i) { } + +HasVirtualInCore::HasVirtualInCore() +{ +} + +int HasVirtualInCore::virtualInCore(int parameter) +{ + return 1; +} diff --git a/tests/NamespacesBase/NamespacesBase.h b/tests/NamespacesBase/NamespacesBase.h index e3db3aa5..30813393 100644 --- a/tests/NamespacesBase/NamespacesBase.h +++ b/tests/NamespacesBase/NamespacesBase.h @@ -52,3 +52,10 @@ template class TemplateClass { }; + +class DLL_API HasVirtualInCore +{ +public: + HasVirtualInCore(); + virtual int virtualInCore(int parameter); +}; diff --git a/tests/NamespacesDerived/NamespacesDerived.Tests.cs b/tests/NamespacesDerived/NamespacesDerived.Tests.cs index 287523c1..43fe904d 100644 --- a/tests/NamespacesDerived/NamespacesDerived.Tests.cs +++ b/tests/NamespacesDerived/NamespacesDerived.Tests.cs @@ -11,4 +11,25 @@ public class NamespaceDerivedTests var parent = derived.Parent; derived.parent(0); } + + [Test] + public void TestOverrideMethodFromDependency() + { + using (var overrideMethodFromDependency = new OverrideMethodFromDependency()) + { + using (var managedObject = new OverrideMethodFromDependency()) + { + overrideMethodFromDependency.ManagedObject = managedObject; + Assert.That(overrideMethodFromDependency.CallManagedOverride(), Is.EqualTo(2)); + } + } + } + + private class OverrideMethodFromDependency : HasVirtualInDependency + { + public override int VirtualInCore(int parameter) + { + return 2; + } + } } \ No newline at end of file diff --git a/tests/NamespacesDerived/NamespacesDerived.cpp b/tests/NamespacesDerived/NamespacesDerived.cpp index 710343bc..dbe579f9 100644 --- a/tests/NamespacesDerived/NamespacesDerived.cpp +++ b/tests/NamespacesDerived/NamespacesDerived.cpp @@ -61,3 +61,12 @@ Abstract* Derived2::getAbstract() { return 0; } + +HasVirtualInDependency::HasVirtualInDependency() +{ +} + +int HasVirtualInDependency::callManagedOverride() +{ + return managedObject->virtualInCore(0); +} diff --git a/tests/NamespacesDerived/NamespacesDerived.h b/tests/NamespacesDerived/NamespacesDerived.h index ad56e89c..c7b6fe83 100644 --- a/tests/NamespacesDerived/NamespacesDerived.h +++ b/tests/NamespacesDerived/NamespacesDerived.h @@ -61,3 +61,11 @@ public: private: TemplateClass t; }; + +class DLL_API HasVirtualInDependency : public HasVirtualInCore +{ +public: + HasVirtualInDependency(); + HasVirtualInDependency* managedObject; + int callManagedOverride(); +};