diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index 41b4eb796..65fa1c6f7 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -225,8 +225,7 @@ namespace Flax.Build.Bindings if (apiType.IsScriptingObject) return typeInfo.Type.Replace("::", "."); - - if (typeInfo.IsPtr && (apiType is LangType || apiType.IsPod)) + if (typeInfo.IsPtr && apiType.IsPod) return typeInfo.Type.Replace("::", ".") + '*'; } @@ -581,6 +580,46 @@ namespace Flax.Build.Bindings contents.AppendLine(); + var useCustomDelegateSignature = false; + for (var i = 0; i < paramsCount; i++) + { + var result = GenerateCSharpNativeToManaged(buildData, eventInfo.Type.GenericArgs[i], classInfo); + if (result[result.Length - 1] == '*') + useCustomDelegateSignature = true; + CppParamsWrappersCache[i] = result; + } + + string eventSignature; + if (useCustomDelegateSignature) + { + contents.Append(indent).Append($"/// The delegate for event {eventInfo.Name}.").AppendLine(); + contents.Append(indent).Append("public delegate void ").Append(eventInfo.Name).Append("Delegate("); + for (var i = 0; i < paramsCount; i++) + { + if (i != 0) + contents.Append(", "); + contents.Append(CppParamsWrappersCache[i]).Append(" arg").Append(i); + } + contents.Append(");").AppendLine().AppendLine(); + eventSignature = "event " + eventInfo.Name + "Delegate"; + } + else + { + eventSignature = "event Action"; + if (paramsCount != 0) + { + eventSignature += '<'; + for (var i = 0; i < paramsCount; i++) + { + if (i != 0) + eventSignature += ", "; + CppParamsWrappersCache[i] = GenerateCSharpNativeToManaged(buildData, eventInfo.Type.GenericArgs[i], classInfo); + eventSignature += CppParamsWrappersCache[i]; + } + eventSignature += '>'; + } + } + foreach (var comment in eventInfo.Comment) { if (comment.Contains("/// ")) @@ -598,19 +637,6 @@ namespace Flax.Build.Bindings contents.Append("private "); if (eventInfo.IsStatic) contents.Append("static "); - string eventSignature = "event Action"; - if (paramsCount != 0) - { - eventSignature += '<'; - for (var i = 0; i < paramsCount; i++) - { - if (i != 0) - eventSignature += ", "; - CppParamsWrappersCache[i] = GenerateCSharpNativeToManaged(buildData, eventInfo.Type.GenericArgs[i], classInfo); - eventSignature += CppParamsWrappersCache[i]; - } - eventSignature += '>'; - } contents.Append(eventSignature); contents.Append(' ').AppendLine(eventInfo.Name); contents.Append(indent).Append('{').AppendLine(); diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs index 70627d97e..721e58347 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs @@ -75,24 +75,38 @@ namespace Flax.Build.Bindings private static string GenerateCppWrapperNativeToManagedParam(BuildData buildData, StringBuilder contents, TypeInfo paramType, string paramName, ApiTypeInfo caller) { - var nativeToManaged = GenerateCppWrapperNativeToManaged(buildData, paramType, caller, out _, null); + var nativeToManaged = GenerateCppWrapperNativeToManaged(buildData, paramType, caller, out var managedTypeAsNative, null); + string result; if (!string.IsNullOrEmpty(nativeToManaged)) - nativeToManaged = string.Format(nativeToManaged, paramName); - else - nativeToManaged = paramName; - if ((!paramType.IsPtr && paramType.Type != "StringView" && paramType.Type != "StringAnsiView") || paramType.IsPod(buildData, caller)) { - if (nativeToManaged == paramName) + result = string.Format(nativeToManaged, paramName); + if (managedTypeAsNative[managedTypeAsNative.Length - 1] == '*') { - nativeToManaged = '&' + nativeToManaged; + // Pass pointer value } else { - contents.Append($" auto __param{paramName} = {nativeToManaged};").AppendLine(); - nativeToManaged = $"&__param{paramName}"; + // Pass as pointer to local variable converted for managed runtime + if (paramType.IsPtr) + result = string.Format(nativeToManaged, '*' + paramName); + contents.Append($" auto __param_{paramName} = {result};").AppendLine(); + result = $"&__param_{paramName}"; } } - return $"(void*){nativeToManaged}"; + else + { + result = paramName; + if (paramType.IsPtr || managedTypeAsNative[managedTypeAsNative.Length - 1] == '*') + { + // Pass pointer value + } + else + { + // Pass as pointer to value + result = '&' + result; + } + } + return $"(void*){result}"; } public static string GenerateCppWrapperNativeToVariant(BuildData buildData, TypeInfo typeInfo, ApiTypeInfo caller, string value) diff --git a/Source/Tools/Flax.Build/Bindings/TypeInfo.cs b/Source/Tools/Flax.Build/Bindings/TypeInfo.cs index 9268e5998..bfead9218 100644 --- a/Source/Tools/Flax.Build/Bindings/TypeInfo.cs +++ b/Source/Tools/Flax.Build/Bindings/TypeInfo.cs @@ -44,7 +44,7 @@ namespace Flax.Build.Bindings return true; // Hardcoded cases - if (Type == "String" || Type == "Array") + if (Type == "String" || Type == "Array" || Type == "StringView" || Type == "StringAnsi" || Type == "StringAnsiView") return false; // Fallback to default