in SharpGen/Generator/Marshallers/StringMarshaller.cs [125:193]
public StatementSyntax GenerateNativeToManaged(CsMarshalBase csElement, bool singleStackFrame)
{
MemberAccessExpressionSyntax PtrToString(NameSyntax implName) =>
MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression,
implName,
IdentifierName(
csElement.IsWideChar ? nameof(Marshal.PtrToStringUni) : nameof(Marshal.PtrToStringAnsi)
)
);
if (csElement.IsArray) // Fixed-length character array
{
if (csElement.IsWideChar && singleStackFrame)
return null;
return FixedStatement(
VariableDeclaration(
VoidPtrType,
SingletonSeparatedList(
VariableDeclarator(PtrIdentifier)
.WithInitializer(
EqualsValueClause(
PrefixUnaryExpression(
SyntaxKind.AddressOfExpression,
GetMarshalStorageLocation(csElement)
)
)
)
)
),
ExpressionStatement(
AssignmentExpression(
SyntaxKind.SimpleAssignmentExpression,
IdentifierName(csElement.Name),
InvocationExpression(
PtrToString(GlobalNamespace.GetTypeNameSyntax(WellKnownName.StringHelpers)),
ArgumentList(
SeparatedList(
new[]
{
Argument(CastExpression(IntPtrType, PtrIdentifierName)),
Argument(
LiteralExpression(
SyntaxKind.NumericLiteralExpression,
Literal(csElement.ArrayDimensionValue - 1)
)
)
}
)
)
)
)
)
);
}
// Variable-length string represented as a pointer.
return ExpressionStatement(
AssignmentExpression(
SyntaxKind.SimpleAssignmentExpression,
IdentifierName(csElement.Name),
InvocationExpression(
PtrToString(GlobalNamespace.GetTypeNameSyntax(BuiltinType.Marshal)),
ArgumentList(SingletonSeparatedList(Argument(GetMarshalStorageLocation(csElement))))
)
)
);
}