Browse Source

CSharpMarshal: Fix unknown length array marshal

For unknown length arrays, also run a conversion loop if the primitive
type encountered needs conversion (e.g. `char` to `sbyte`).
pull/1748/head
Trung 2 years ago
parent
commit
6d9e5cc4de
No known key found for this signature in database
GPG Key ID: 8C6357127C5190F6
  1. 7
      src/Generator/Generators/CSharp/CSharpMarshal.cs

7
src/Generator/Generators/CSharp/CSharpMarshal.cs

@ -875,7 +875,8 @@ namespace CppSharp.Generators.CSharp @@ -875,7 +875,8 @@ namespace CppSharp.Generators.CSharp
var elementType = arrayType.Type.Desugar();
if (elementType.IsPrimitiveType() ||
if ((elementType.IsPrimitiveType() &&
!(elementType.IsPrimitiveType(PrimitiveType.Char) && Context.Context.Options.MarshalCharAsManagedChar)) ||
elementType.IsPointerToPrimitiveType())
{
if (Context.Context.Options.UseSpan && !elementType.IsConstCharString())
@ -917,6 +918,10 @@ namespace CppSharp.Generators.CSharp @@ -917,6 +918,10 @@ namespace CppSharp.Generators.CSharp
Context.Before.WriteLine($@"{intermediateArray}[i] = {
element} is null ? {intPtrZero} : {element}.{Helpers.InstanceIdentifier};");
}
else if (elementType.IsPrimitiveType(PrimitiveType.Char) &&
Context.Context.Options.MarshalCharAsManagedChar)
Context.Before.WriteLine($@"{intermediateArray}[i] = global::System.Convert.ToSByte({
element});");
else
Context.Before.WriteLine($@"{intermediateArray}[i] = {
element} is null ? new {intermediateArrayType}() : *({

Loading…
Cancel
Save