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