diff --git a/src/Generator/Generators/CSharp/CSharpSources.cs b/src/Generator/Generators/CSharp/CSharpSources.cs index 99f0802d..9d3a76d3 100644 --- a/src/Generator/Generators/CSharp/CSharpSources.cs +++ b/src/Generator/Generators/CSharp/CSharpSources.cs @@ -1032,11 +1032,12 @@ namespace CppSharp.Generators.CSharp Type varType = var.Type.Desugar(); var arrayType = varType as ArrayType; + var elementType = arrayType?.Type.Desugar(); var @class = var.Namespace as Class; var isRefTypeArray = arrayType != null && @class != null && @class.IsRefType; if (isRefTypeArray) { - string cast = arrayType.Type.IsPrimitiveType(PrimitiveType.Char) && + string cast = elementType.IsPrimitiveType(PrimitiveType.Char) && arrayType.QualifiedType.Qualifiers.IsConst ? string.Empty : "(byte*)"; WriteLine($"var {ptr} = {cast}{location};"); @@ -1054,11 +1055,18 @@ namespace CppSharp.Generators.CSharp var ctx = new CSharpMarshalContext(Context) { ArgName = var.Name, - ReturnVarName = (isRefTypeArray || - (arrayType != null && arrayType.Type.Desugar().IsPrimitiveType()) ? string.Empty : "*") - + Generator.GeneratedIdentifier("ptr"), ReturnType = new QualifiedType(var.Type) }; + var prefix = string.Empty; + if (!isRefTypeArray && elementType == null) + ctx.ReturnVarName = $"*{ptr}"; + else if (elementType == null || elementType.IsPrimitiveType() || + arrayType.SizeType == ArrayType.ArraySize.Constant) + ctx.ReturnVarName = ptr; + else + ctx.ReturnVarName = $@"{elementType}.{ + Helpers.CreateInstanceIdentifier}(new { + CSharpTypePrinter.IntPtrType}({ptr}))"; var marshal = new CSharpMarshalNativeToManagedPrinter(ctx); var.QualifiedType.Visit(marshal); diff --git a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs index e61b25f4..8a1225da 100644 --- a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs +++ b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs @@ -134,7 +134,8 @@ namespace CppSharp.Generators.CSharp var arraySuffix = array.SizeType != ArrayType.ArraySize.Constant && MarshalKind == MarshalKind.ReturnVariableArray ? - (ContextKind == TypePrinterContextKind.Managed ? "*" : string.Empty) : "[]"; + (ContextKind == TypePrinterContextKind.Managed && + arrayType.IsPrimitiveType() ? "*" : string.Empty) : "[]"; return $"{arrayType.Visit(this)}{arraySuffix}"; } diff --git a/src/Generator/Types/TypeIgnoreChecker.cs b/src/Generator/Types/TypeIgnoreChecker.cs index 99596068..a9582aaf 100644 --- a/src/Generator/Types/TypeIgnoreChecker.cs +++ b/src/Generator/Types/TypeIgnoreChecker.cs @@ -138,22 +138,14 @@ namespace CppSharp return false; } - var arrayElemType = array.Type.Desugar(); - - if (array.SizeType == ArrayType.ArraySize.Incomplete && - array.QualifiedType.Qualifiers.IsConst && - !arrayElemType.IsPrimitiveType()) - { - Ignore(); - return false; - } - if (!array.QualifiedType.Visit(this)) return false; if (array.SizeType != ArrayType.ArraySize.Constant) return true; + var arrayElemType = array.Type.Desugar(); + Class @class; if (arrayElemType.TryGetClass(out @class) && @class.IsRefType) return true; diff --git a/tests/CSharp/CSharp.Tests.cs b/tests/CSharp/CSharp.Tests.cs index 856c70a9..4f136957 100644 --- a/tests/CSharp/CSharp.Tests.cs +++ b/tests/CSharp/CSharp.Tests.cs @@ -1074,6 +1074,7 @@ public unsafe class CSharpTests : GeneratorTestFixture { string[] strings = { "The ", "test ", "works." }; Assert.That(CSharp.CSharp.TakeStringArray(strings), Is.EqualTo("The test works.")); + Assert.That(CSharp.CSharp.TakeConstStringArray(strings), Is.EqualTo("The test works.")); } private class OverrideVirtualTemplate : VirtualTemplate diff --git a/tests/CSharp/CSharp.cpp b/tests/CSharp/CSharp.cpp index 8f7bb677..8233a3ec 100644 --- a/tests/CSharp/CSharp.cpp +++ b/tests/CSharp/CSharp.cpp @@ -1408,3 +1408,8 @@ std::string takeStringArray(const char* arrayOfStrings[]) } return result; } + +std::string takeConstStringArray(const char* const arrayOfStrings[]) +{ + return takeStringArray(const_cast(arrayOfStrings)); +} diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h index a586c88b..9596920c 100644 --- a/tests/CSharp/CSharp.h +++ b/tests/CSharp/CSharp.h @@ -1240,3 +1240,5 @@ inline namespace InlineNamespace DLL_API int takeArrays(Foo* arrayOfPointersToObjects[], int arrayOfPrimitives[], Foo arrayOfObjects[]); DLL_API std::string takeStringArray(const char* arrayOfStrings[]); + +DLL_API std::string takeConstStringArray(const char* const arrayOfStrings[]);