From 7434189894350e7596dae0b831eb907450ee3ba9 Mon Sep 17 00:00:00 2001 From: Kevin Zhang Date: Fri, 8 Oct 2021 17:27:15 +0800 Subject: [PATCH 1/2] Remove unnecessary specifier. The unsafe specifier in C# binding is unnecessary. --- Source/buildbindingcsharp.go | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/Source/buildbindingcsharp.go b/Source/buildbindingcsharp.go index 6900291f..c271aa50 100644 --- a/Source/buildbindingcsharp.go +++ b/Source/buildbindingcsharp.go @@ -800,7 +800,7 @@ func buildBindingCSharpImplementation(component ComponentDefinition, w LanguageW } w.Writeln(" [StructLayout(LayoutKind.Explicit, Size=%d)]", fieldOffset) - w.Writeln(" public unsafe struct Internal%s", structinfo.Name) + w.Writeln(" public struct Internal%s", structinfo.Name) w.Writeln(" {") w.Writelns(" ", memberLines) w.Writeln(" }") @@ -831,7 +831,7 @@ func buildBindingCSharpImplementation(component ComponentDefinition, w LanguageW parameters = "IntPtr Handle, " + parameters } - w.Writeln(" public unsafe extern static Int32 %s_%s (%s);", class.ClassName, method.MethodName, parameters) + w.Writeln(" public extern static Int32 %s_%s (%s);", class.ClassName, method.MethodName, parameters) w.Writeln("") } @@ -854,7 +854,7 @@ func buildBindingCSharpImplementation(component ComponentDefinition, w LanguageW for i := 0; i < len(component.Structs); i++ { structinfo := component.Structs[i] - w.Writeln(" public unsafe static s%s convertInternalToStruct_%s (Internal%s int%s)", structinfo.Name, structinfo.Name, structinfo.Name, structinfo.Name) + w.Writeln(" public static s%s convertInternalToStruct_%s (Internal%s int%s)", structinfo.Name, structinfo.Name, structinfo.Name, structinfo.Name) w.Writeln(" {") w.Writeln(" s%s %s;", structinfo.Name, structinfo.Name) @@ -901,7 +901,7 @@ func buildBindingCSharpImplementation(component ComponentDefinition, w LanguageW w.Writeln(" }") w.Writeln("") - w.Writeln(" public unsafe static Internal%s convertStructToInternal_%s (s%s %s)", structinfo.Name, structinfo.Name, structinfo.Name, structinfo.Name) + w.Writeln(" public static Internal%s convertStructToInternal_%s (s%s %s)", structinfo.Name, structinfo.Name, structinfo.Name, structinfo.Name) w.Writeln(" {") w.Writeln(" Internal%s int%s;", structinfo.Name, structinfo.Name) @@ -1258,12 +1258,6 @@ func buildCSharpExampleProject(componentdefinition ComponentDefinition, w Langua w.Writeln(" ") w.Writeln(" x64") w.Writeln(" ") - w.Writeln(" ") - w.Writeln(" true") - w.Writeln(" ") - w.Writeln(" ") - w.Writeln(" true") - w.Writeln(" ") w.Writeln(" ") w.Writeln(" ", NameSpace, NameSpace) w.Writeln(" ") From bf9b736106d5d819028506287a0ae3763aff0418 Mon Sep 17 00:00:00 2001 From: Kevin Zhang Date: Wed, 27 Oct 2021 10:23:24 +0800 Subject: [PATCH 2/2] Fixed issue with 'fixed' specifier. --- Source/buildbindingcsharp.go | 43 ++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/Source/buildbindingcsharp.go b/Source/buildbindingcsharp.go index c271aa50..b7b64ce0 100644 --- a/Source/buildbindingcsharp.go +++ b/Source/buildbindingcsharp.go @@ -739,68 +739,73 @@ func buildBindingCSharpImplementation(component ComponentDefinition, w LanguageW element := structinfo.Members[j] arraysuffix := "" - fixedtag := "" + arrayinitialization:= "" multiplier := 1 if element.Rows > 0 { + arraysuffix = "[]" + arraytypename, err := getCSharpParameterType(element.Type, NameSpace, "", true) + if err != nil { + return err + } + if element.Columns > 0 { multiplier = element.Rows * element.Columns - arraysuffix = fmt.Sprintf("[%d]", multiplier) + arrayinitialization = fmt.Sprintf(" = new %s[%d]", arraytypename, multiplier) } else { multiplier = element.Rows - arraysuffix = fmt.Sprintf("[%d]", multiplier) + arrayinitialization = fmt.Sprintf(" = new %s[%d]", arraytypename, multiplier) } - fixedtag = "fixed " } switch element.Type { case "uint8": - memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public %sByte %s%s;", fieldOffset, fixedtag, element.Name, arraysuffix)) + memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public Byte%s %s%s;", fieldOffset, arraysuffix, element.Name, arrayinitialization)) fieldOffset = fieldOffset + 1*multiplier case "uint16": - memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public %sUInt16 %s%s;", fieldOffset, fixedtag, element.Name, arraysuffix)) + memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public UInt16%s %s%s;", fieldOffset, arraysuffix, element.Name, arrayinitialization)) fieldOffset = fieldOffset + 2*multiplier case "uint32": - memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public %sUInt32 %s%s;", fieldOffset, fixedtag, element.Name, arraysuffix)) + memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public UInt32%s %s%s;", fieldOffset, arraysuffix, element.Name, arrayinitialization)) fieldOffset = fieldOffset + 4*multiplier case "uint64": - memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public %sUInt64 %s%s;", fieldOffset, fixedtag, element.Name, arraysuffix)) + memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public UInt64%s %s%s;", fieldOffset, arraysuffix, element.Name, arrayinitialization)) fieldOffset = fieldOffset + 8*multiplier case "int8": - memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public %ssbyte %s%s;", fieldOffset, fixedtag, element.Name, arraysuffix)) + memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public Int8%s %s%s;", fieldOffset, arraysuffix, element.Name, arrayinitialization)) fieldOffset = fieldOffset + 1*multiplier case "int16": - memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public %sInt16 %s%s;", fieldOffset, fixedtag, element.Name, arraysuffix)) + memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public Int16%s %s%s;", fieldOffset, arraysuffix, element.Name, arrayinitialization)) fieldOffset = fieldOffset + 2*multiplier case "int32": - memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public %sInt32 %s%s;", fieldOffset, fixedtag, element.Name, arraysuffix)) + memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public Int32%s %s%s;", fieldOffset, arraysuffix, element.Name, arrayinitialization)) fieldOffset = fieldOffset + 4*multiplier case "int64": - memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public %sInt64 %s%s;", fieldOffset, fixedtag, element.Name, arraysuffix)) + memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public Int64%s %s%s;", fieldOffset, arraysuffix, element.Name, arrayinitialization)) fieldOffset = fieldOffset + 8*multiplier case "bool": - memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public %sByte %s%s;", fieldOffset, fixedtag, element.Name, arraysuffix)) + memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public Byte%s %s%s;", fieldOffset, arraysuffix, element.Name, arrayinitialization)) fieldOffset = fieldOffset + 1*multiplier case "single": - memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public %sSingle %s%s;", fieldOffset, fixedtag, element.Name, arraysuffix)) + memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public Single%s %s%s;", fieldOffset, arraysuffix, element.Name, arrayinitialization)) fieldOffset = fieldOffset + 4*multiplier case "double": - memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public %sDouble %s%s;", fieldOffset, fixedtag, element.Name, arraysuffix)) + memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public Double%s %s%s;", fieldOffset, arraysuffix, element.Name, arrayinitialization)) fieldOffset = fieldOffset + 8*multiplier case "pointer": - memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public %sUInt64 %s%s;", fieldOffset, fixedtag, element.Name, arraysuffix)) + memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public Uint64%s %s%s;", fieldOffset, arraysuffix, element.Name, arrayinitialization)) fieldOffset = fieldOffset + 8*multiplier case "string": return fmt.Errorf("it is not possible for struct s%s%s to contain a string value", NameSpace, structinfo.Name) case "class", "optionalclass": return fmt.Errorf("it is not possible for struct s%s%s to contain a handle value", NameSpace, structinfo.Name) case "enum": - memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public %sInt32 %s%s;", fieldOffset, fixedtag, element.Name, arraysuffix)) + memberLines = append(memberLines, fmt.Sprintf("[FieldOffset(%d)] public Int32%s %s%s;", fieldOffset, arraysuffix, element.Name, arrayinitialization)) fieldOffset = fieldOffset + 4*multiplier } } w.Writeln(" [StructLayout(LayoutKind.Explicit, Size=%d)]", fieldOffset) - w.Writeln(" public struct Internal%s", structinfo.Name) + w.Writeln(" public class Internal%s", structinfo.Name) w.Writeln(" {") w.Writelns(" ", memberLines) w.Writeln(" }") @@ -903,7 +908,7 @@ func buildBindingCSharpImplementation(component ComponentDefinition, w LanguageW w.Writeln(" public static Internal%s convertStructToInternal_%s (s%s %s)", structinfo.Name, structinfo.Name, structinfo.Name, structinfo.Name) w.Writeln(" {") - w.Writeln(" Internal%s int%s;", structinfo.Name, structinfo.Name) + w.Writeln(" Internal%s int%s = new Internal%s();", structinfo.Name, structinfo.Name, structinfo.Name) for j := 0; j < len(structinfo.Members); j++ { element := structinfo.Members[j]