diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index 1e50ba4e3..442c5af00 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -58,6 +58,7 @@ namespace Flax.Build.Bindings { "ManagedScriptingObject", "FlaxEngine.Object" }, { "Variant", "object" }, { "VariantType", "System.Type" }, + { "BytesContainer", "byte[]" }, // Mono types { "MonoObject", "object" }, @@ -1574,7 +1575,7 @@ namespace Flax.Build.Bindings type = "IntPtr"; else if (fieldInfo.Type.IsPtr && !originalType.EndsWith("*")) type = "IntPtr"; - else if (fieldInfo.Type.Type == "Array" || fieldInfo.Type.Type == "Span" || fieldInfo.Type.Type == "DataContainer" || fieldInfo.Type.Type == "BytesContainer") + else if (fieldInfo.Type.Type == "Array" || fieldInfo.Type.Type == "Span" || fieldInfo.Type.Type == "DataContainer") { type = "IntPtr"; apiType = FindApiTypeInfo(buildData, fieldInfo.Type.GenericArgs[0], structureInfo); @@ -1649,7 +1650,7 @@ namespace Flax.Build.Bindings freeContents.AppendLine($"if (unmanaged.{fieldInfo.Name} != IntPtr.Zero) {{ ManagedHandle handle = ManagedHandle.FromIntPtr(unmanaged.{fieldInfo.Name}); Span<{internalElementType}> values = (Unsafe.As(handle.Target)).ToSpan<{internalElementType}>(); foreach (var value in values) {{ {originalElementTypeMarshaller}.Free(value); }} (Unsafe.As(handle.Target)).Free(); handle.Free(); }}"); freeContents2.AppendLine($"if (unmanaged.{fieldInfo.Name} != IntPtr.Zero) {{ ManagedHandle handle = ManagedHandle.FromIntPtr(unmanaged.{fieldInfo.Name}); Span<{internalElementType}> values = (Unsafe.As(handle.Target)).ToSpan<{internalElementType}>(); foreach (var value in values) {{ {originalElementTypeMarshaller}.Free(value); }} (Unsafe.As(handle.Target)).Free(); handle.Free(); }}"); } - else if (fieldInfo.Type.GenericArgs[0].IsObjectRef) + else if (fieldInfo.Type.GenericArgs != null && fieldInfo.Type.GenericArgs[0].IsObjectRef) { // Array elements passed as GCHandles toManagedContent.AppendLine($"unmanaged.{fieldInfo.Name} != IntPtr.Zero ? NativeInterop.GCHandleArrayToManagedArray<{originalElementType}>(Unsafe.As(ManagedHandle.FromIntPtr(unmanaged.{fieldInfo.Name}).Target)) : null;"); @@ -1839,6 +1840,20 @@ namespace Flax.Build.Bindings foreach (var fieldInfo in structureInfo.Fields) { contents.AppendLine(); + + // Generate a getter-property for accessing the BytesContainer as a Span + if (fieldInfo.Type.Type == "BytesContainer") + { + // Fields of BytesContainer + contents.Append(indent).AppendLine($"private IntPtr __{fieldInfo.Name}_Ptr;").AppendLine(); + contents.Append(indent).AppendLine($"private int __{fieldInfo.Name}_Length;").AppendLine(); + contents.Append(indent).AppendLine($"[MarshalAs(UnmanagedType.U1)] private bool __{fieldInfo.Name}_IsAllocated;").AppendLine(); + + GenerateCSharpComment(contents, indent, fieldInfo.Comment); + string spanType = fieldInfo.IsReadOnly ? "ReadOnlySpan" : "Span"; + contents.Append(indent).AppendLine($"{GenerateCSharpAccessLevel(fieldInfo.Access)}{spanType} {fieldInfo.Name} => new {spanType}(__{fieldInfo.Name}_Ptr.ToPointer(), __{fieldInfo.Name}_Length);").AppendLine(); + continue; + } GenerateCSharpComment(contents, indent, fieldInfo.Comment); GenerateCSharpAttributes(buildData, contents, indent, structureInfo, fieldInfo, fieldInfo.IsStatic, fieldInfo.DefaultValue, fieldInfo.Type); #if USE_NETCORE