diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 0814f99f..d656e1a9 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -2634,10 +2634,11 @@ namespace CppSharp.Generators.CSharp var paramType = param.Type; Class @class; - if ( (paramType.GetFinalPointee() ?? paramType).Desugar().TryGetClass(out @class) - && @class.IsRefType) + if ((paramType.GetFinalPointee() ?? paramType).Desugar().TryGetClass(out @class)) { - WriteLine("{0} = new {1}();", param.Name, paramType); + var qualifiedIdentifier = CSharpMarshalNativeToManagedPrinter.QualifiedIdentifier( + @class.OriginalClass ?? @class); + WriteLine("{0} = new {1}();", param.Name, qualifiedIdentifier); } } diff --git a/tests/Basic/Basic.Tests.cs b/tests/Basic/Basic.Tests.cs index 247fb10a..63cbd768 100644 --- a/tests/Basic/Basic.Tests.cs +++ b/tests/Basic/Basic.Tests.cs @@ -523,5 +523,17 @@ public class BasicTests : GeneratorTestFixture { var empty = new ReturnsEmpty().Empty; } + + [Test] + public void TestOutTypeClassesPassTry() + { + RefTypeClassPassTry refTypeClassPassTry; + basic.funcTryRefTypeOut(out refTypeClassPassTry); + basic.funcTryRefTypePtrOut(out refTypeClassPassTry); + + ValueTypeClassPassTry valueTypeClassPassTry; + basic.funcTryValTypeOut(out valueTypeClassPassTry); + basic.funcTryValTypePtrOut(out valueTypeClassPassTry); + } } \ No newline at end of file diff --git a/tests/Basic/Basic.cpp b/tests/Basic/Basic.cpp index 34e68879..e5e41f7b 100644 --- a/tests/Basic/Basic.cpp +++ b/tests/Basic/Basic.cpp @@ -476,3 +476,19 @@ Empty ReturnsEmpty::getEmpty() { return Empty(); } + +void funcTryRefTypePtrOut(CS_OUT RefTypeClassPassTry* classTry) +{ +} + +void funcTryRefTypeOut(CS_OUT RefTypeClassPassTry classTry) +{ +} + +void funcTryValTypePtrOut(CS_OUT ValueTypeClassPassTry* classTry) +{ +} + +void funcTryValTypeOut(CS_OUT ValueTypeClassPassTry classTry) +{ +} diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index f87bec63..2279088e 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -759,16 +759,10 @@ public: } ct; }; -#define CS_API -class CS_API ClassPassTry -{ -public: - int n; - char c; -}; +class DLL_API RefTypeClassPassTry { }; -void funcTry(CS_OUT ClassPassTry* classTry) { } -void funcTry2(CS_OUT ClassPassTry classTry) { } +void DLL_API funcTryRefTypePtrOut(CS_OUT RefTypeClassPassTry* classTry); +void DLL_API funcTryRefTypeOut(CS_OUT RefTypeClassPassTry classTry); #define ARRAY_LENGTH 5 #define CS_VALUE_TYPE @@ -805,3 +799,8 @@ class DLL_API ReturnsEmpty public: Empty getEmpty(); }; + +class DLL_API CS_VALUE_TYPE ValueTypeClassPassTry { }; + +void DLL_API funcTryValTypePtrOut(CS_OUT ValueTypeClassPassTry* classTry); +void DLL_API funcTryValTypeOut(CS_OUT ValueTypeClassPassTry classTry); diff --git a/tests/CSharpTemp/CSharpTemp.Tests.cs b/tests/CSharpTemp/CSharpTemp.Tests.cs index f3d48368..123e9d14 100644 --- a/tests/CSharpTemp/CSharpTemp.Tests.cs +++ b/tests/CSharpTemp/CSharpTemp.Tests.cs @@ -422,4 +422,15 @@ public class CSharpTempTests : GeneratorTestFixture Assert.AreEqual("value", ex.ParamName); Assert.AreEqual("The provided array's dimensions doesn't match the required size." + Environment.NewLine +"Parameter name: value", ex.Message); } + + [Test] + public void TestOutTypeInterfacePassTry() + { + var interfaceClassObj = new TestParamToInterfacePassBaseTwo(); + ITestParamToInterfacePassBaseTwo interfaceType = interfaceClassObj; + var obj = new TestOutTypeInterfaces(); + obj.FuncTryInterfaceTypeOut(out interfaceType); + ITestParamToInterfacePassBaseTwo interfaceTypePtr; + obj.FuncTryInterfaceTypePtrOut(out interfaceTypePtr); + } } diff --git a/tests/CSharpTemp/CSharpTemp.cpp b/tests/CSharpTemp/CSharpTemp.cpp index 3b4186a2..cee8e016 100644 --- a/tests/CSharpTemp/CSharpTemp.cpp +++ b/tests/CSharpTemp/CSharpTemp.cpp @@ -759,3 +759,11 @@ int OverrideFromIndirectSecondaryBase::property() { return 1; } + +void TestOutTypeInterfaces::funcTryInterfaceTypePtrOut(CS_OUT TestParamToInterfacePassBaseTwo* classTry) +{ +} + +void TestOutTypeInterfaces::funcTryInterfaceTypeOut(CS_OUT TestParamToInterfacePassBaseTwo classTry) +{ +} diff --git a/tests/CSharpTemp/CSharpTemp.cs b/tests/CSharpTemp/CSharpTemp.cs index fb8d7cde..a52e3a78 100644 --- a/tests/CSharpTemp/CSharpTemp.cs +++ b/tests/CSharpTemp/CSharpTemp.cs @@ -133,6 +133,7 @@ namespace CppSharp.Tests // are not ambiguous with multiple inheritance pass enabled. driver.Options.GenerateConversionOperators = true; driver.TranslationUnitPasses.AddPass(new TestAttributesPass()); + driver.TranslationUnitPasses.AddPass(new CheckMacroPass()); driver.Options.MarshalCharAsManagedChar = true; driver.Options.GenerateDefaultValuesForArguments = true; driver.Options.GenerateSingleCSharpFile = true; diff --git a/tests/CSharpTemp/CSharpTemp.h b/tests/CSharpTemp/CSharpTemp.h index 6af6ebd6..d6ec3ce8 100644 --- a/tests/CSharpTemp/CSharpTemp.h +++ b/tests/CSharpTemp/CSharpTemp.h @@ -700,3 +700,10 @@ class DLL_API TestVariableWithFixedArrayType public: static Foo variableWithFixedArrayType[2]; }; + +class DLL_API TestOutTypeInterfaces +{ +public: + void funcTryInterfaceTypePtrOut(CS_OUT TestParamToInterfacePassBaseTwo* classTry); + void funcTryInterfaceTypeOut(CS_OUT TestParamToInterfacePassBaseTwo classTry); +}; \ No newline at end of file