@ -906,13 +906,11 @@ namespace CppSharp.Generators.CSharp
else
else
{
{
var name = @class . Layout . Fields . First ( f = > f . FieldPtr = = field . OriginalPtr ) . Name ;
var name = @class . Layout . Fields . First ( f = > f . FieldPtr = = field . OriginalPtr ) . Name ;
var printed = TypePrinter . PrintNative ( @class ) ;
var identifier = SafeIdentifier ( name ) ;
ctx . ReturnVarName = string . Format ( "{0}{1}{2}" ,
if ( @class . IsValueType )
@class . IsValueType
ctx . ReturnVarName = $"{Helpers.InstanceField}.{identifier}" ;
? Helpers . InstanceField
else
: $"(({printed}*) {Helpers.InstanceIdentifier})" ,
ctx . ReturnVarName = $"(({TypePrinter.PrintNative(@class)}*){Helpers.InstanceIdentifier})->{identifier}" ;
@class . IsValueType ? "." : "->" ,
SafeIdentifier ( name ) ) ;
}
}
param . Visit ( marshal ) ;
param . Visit ( marshal ) ;
@ -1174,13 +1172,24 @@ namespace CppSharp.Generators.CSharp
private void GenerateFieldGetter ( Field field , Class @class , QualifiedType returnType )
private void GenerateFieldGetter ( Field field , Class @class , QualifiedType returnType )
{
{
var name = @class . Layout . Fields . First ( f = > f . FieldPtr = = field . OriginalPtr ) . Name ;
var name = @class . Layout . Fields . First ( f = > f . FieldPtr = = field . OriginalPtr ) . Name ;
String returnVar ;
if ( @class . IsValueType )
returnVar = $@"{Helpers.InstanceField}.{SafeIdentifier(name)}" ;
else
{
returnVar = $@"(({TypePrinter.PrintNative(@class)}*) {Helpers.InstanceIdentifier})->{SafeIdentifier(name)}" ;
// Class field getter should return a reference object instead of a copy. Wrapping `returnVar` in
// IntPtr ensures that non-copying object constructor is invoked.
Class typeClass ;
if ( field . Type . TryGetClass ( out typeClass ) & & ! typeClass . IsValueType )
returnVar = $"new {CSharpTypePrinter.IntPtrType}(&{returnVar})" ;
}
var ctx = new CSharpMarshalContext ( Context )
var ctx = new CSharpMarshalContext ( Context )
{
{
ArgName = field . Name ,
ArgName = field . Name ,
Declaration = field ,
Declaration = field ,
ReturnVarName = $ @ "{(@class.IsValueType ? Helpers.InstanceField :
ReturnVarName = returnVar ,
$"(({TypePrinter.PrintNative(@class)}*) {Helpers.InstanceIdentifier})" ) } {
( @class . IsValueType ? "." : "->" ) } { SafeIdentifier ( name ) } ",
ReturnType = returnType
ReturnType = returnType
} ;
} ;
ctx . PushMarshalKind ( MarshalKind . NativeField ) ;
ctx . PushMarshalKind ( MarshalKind . NativeField ) ;