From f5a37ec3b41281cd33af723b7aea939367901c37 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 24 Jan 2023 18:49:33 +0100 Subject: [PATCH] Final fix for full P/Invoke compatibility on Linux --- Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs | 2 +- Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs | 5 +++-- Source/Tools/Flax.Build/Utilities/CppNameMangling.cs | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index 356651b01..981c1ee14 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -1010,7 +1010,7 @@ namespace Flax.Build.Bindings if (buildData.Toolchain.Compiler == TargetCompiler.MSVC) libraryEntryPoint = $"{classInfo.FullNameManaged}::Internal_{eventInfo.Name}_Bind"; // MSVC allows to override exported symbol name else - libraryEntryPoint = CppNameMangling.MangleFunctionName(buildData, eventInfo.Name + "_ManagedBind", classInfo.FullNameNativeInternal + "Internal", CSharpEventBindReturn, CSharpEventBindParams); + libraryEntryPoint = CppNameMangling.MangleFunctionName(buildData, eventInfo.Name + "_ManagedBind", classInfo.FullNameNativeInternal + "Internal", CSharpEventBindReturn, eventInfo.IsStatic ? null : new TypeInfo(classInfo.FullNameNative) { IsPtr = true }, CSharpEventBindParams); contents.Append(indent).Append($"[LibraryImport(\"{classInfo.ParentModule.Module.BinaryModuleName}\", EntryPoint = \"{libraryEntryPoint}\", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.StringMarshaller))]").AppendLine(); contents.Append(indent).Append($"internal static partial void Internal_{eventInfo.Name}_Bind("); if (!eventInfo.IsStatic) diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs index 5042ad21f..dcb672f8f 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs @@ -967,12 +967,13 @@ namespace Flax.Build.Bindings else { // For simple functions we can bind it directly (CppNameMangling is incomplete for complex cases) - if (functionInfo.Parameters.Count + functionInfo.Parameters.Count == 0) + // TODO: improve this to use wrapper method directly from P/Invoke if possible + /*if (functionInfo.Parameters.Count + functionInfo.Parameters.Count == 0) { useSeparateImpl = true; // DLLEXPORT doesn't properly export function thus separate implementation from declaration libraryEntryPoint = CppNameMangling.MangleFunctionName(buildData, functionInfo.Name, callerName, functionInfo.ReturnType, functionInfo.IsStatic ? null : new TypeInfo(caller.Name) { IsPtr = true }, functionInfo.Parameters, functionInfo.Glue.CustomParameters); } - else + else*/ { useLibraryExportInPlainC = true; libraryEntryPoint = $"{callerName}_{functionInfo.UniqueName}"; diff --git a/Source/Tools/Flax.Build/Utilities/CppNameMangling.cs b/Source/Tools/Flax.Build/Utilities/CppNameMangling.cs index 2311c27a0..590f83270 100644 --- a/Source/Tools/Flax.Build/Utilities/CppNameMangling.cs +++ b/Source/Tools/Flax.Build/Utilities/CppNameMangling.cs @@ -12,7 +12,7 @@ namespace Flax.Build /// internal static class CppNameMangling { - public static string MangleFunctionName(Builder.BuildData buildData, string name, string outerName, TypeInfo returnType, TypeInfo parameter0, List parameters1, List parameters2) + public static string MangleFunctionName(Builder.BuildData buildData, string name, string outerName, TypeInfo returnType, TypeInfo parameter0 = null, List parameters1 = null, List parameters2 = null) { List parameters = null; if (parameter0 == null)