From ca2ebc3a39d210cb0a0e82b14342dde33b270398 Mon Sep 17 00:00:00 2001 From: "1992414357@qq.com" <1992414357@qq.com> Date: Fri, 20 Jun 2025 02:42:54 +0800 Subject: Update Csharp Bindings --- Project_Export.toml | 4 ++ .../NoGamepads_CharpBindings/.run/Example.run.xml | 20 ------ .../.run/Generate Bindings.run.xml | 20 ++++++ .../.run/Generate Csharp Bindings.run.xml | 20 ------ .../.run/Run Example.run.xml | 20 ++++++ .../NoGamepads_Bindings/NoGamepads_Bindings.csproj | 1 + .../NoGamepads_Bindings/Program.cs | 58 ++++++++++++++-- .../NoGamepads_Core/Data/Player.cs | 77 +++++++++++++++++++++- .../NoGamepads_Example/Program.cs | 20 ++++-- 9 files changed, 189 insertions(+), 51 deletions(-) delete mode 100644 core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Example.run.xml create mode 100644 core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Generate Bindings.run.xml delete mode 100644 core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Generate Csharp Bindings.run.xml create mode 100644 core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Run Example.run.xml diff --git a/Project_Export.toml b/Project_Export.toml index ba2c27d..e45285b 100644 --- a/Project_Export.toml +++ b/Project_Export.toml @@ -56,4 +56,8 @@ c_binding_example_deps_win = { raw = "./", target = "./core/bindings/lang/clang/ csharp_binding_deps_win = { raw = "./", target = "./core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Bindings/Native/", files = [ "nogamepads_c.dll", +] } + +csharp_binding_libs_win = { raw = "./", target = "./core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Example/bin/Debug/net6.0/", files = [ + "nogamepads_c.dll" ] } \ No newline at end of file diff --git a/core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Example.run.xml b/core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Example.run.xml deleted file mode 100644 index 91f4cc3..0000000 --- a/core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Example.run.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - \ No newline at end of file diff --git a/core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Generate Bindings.run.xml b/core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Generate Bindings.run.xml new file mode 100644 index 0000000..0e7c565 --- /dev/null +++ b/core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Generate Bindings.run.xml @@ -0,0 +1,20 @@ + + + + \ No newline at end of file diff --git a/core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Generate Csharp Bindings.run.xml b/core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Generate Csharp Bindings.run.xml deleted file mode 100644 index e70ca09..0000000 --- a/core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Generate Csharp Bindings.run.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - \ No newline at end of file diff --git a/core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Run Example.run.xml b/core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Run Example.run.xml new file mode 100644 index 0000000..792c169 --- /dev/null +++ b/core/bindings/lang/csharp/NoGamepads_CharpBindings/.run/Run Example.run.xml @@ -0,0 +1,20 @@ + + + + \ No newline at end of file diff --git a/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Bindings/NoGamepads_Bindings.csproj b/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Bindings/NoGamepads_Bindings.csproj index b12992a..aaec264 100644 --- a/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Bindings/NoGamepads_Bindings.csproj +++ b/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Bindings/NoGamepads_Bindings.csproj @@ -15,6 +15,7 @@ + diff --git a/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Bindings/Program.cs b/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Bindings/Program.cs index ebb5f76..f65f182 100644 --- a/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Bindings/Program.cs +++ b/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Bindings/Program.cs @@ -1,16 +1,63 @@ using CppSharp; using CppSharp.AST; +using CppSharp.AST.Extensions; using CppSharp.Generators; -using CppSharp.Generators.AST; -using RecordArgABI = CppSharp.Parser.AST.RecordArgABI; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; namespace NoGamepads_Bindings; internal static class Program { - public static void Main(string[] args) + public static void Main() { ConsoleDriver.Run(new NoGamepadsLibrary()); + FixRefProperties(); + } + + private static void FixRefProperties() + { + var directory = "NoGamepads_Core/Generated"; + var files = Directory.GetFiles(directory, "*.cs", SearchOption.AllDirectories); + + foreach (var file in files) + { + var code = File.ReadAllText(file); + var tree = CSharpSyntaxTree.ParseText(code); + var root = tree.GetRoot(); + + var newRoot = root.ReplaceNodes( + root.DescendantNodes().OfType(), + (prop, _) => + { + // internal ref FfiXXXUnion.__Internal __Instance => ref __instance; + if (prop.Identifier.Text != "__Instance") + return prop; + + if (prop.Type is RefTypeSyntax refType && + prop.ExpressionBody?.Expression is RefExpressionSyntax refExpr && + refType.Type.ToString().EndsWith(".__Internal", StringComparison.Ordinal) && + refExpr.Expression is IdentifierNameSyntax fieldRef && + fieldRef.Identifier.Text == "__instance") + { + var newType = refType.Type.WithTriviaFrom(refType); + var newExpr = fieldRef.WithTriviaFrom(refExpr); + + return prop + .WithType(newType) + .WithExpressionBody(SyntaxFactory.ArrowExpressionClause(newExpr)) + .WithSemicolonToken(prop.SemicolonToken); + } + + return prop; + }); + + if (!newRoot.IsEquivalentTo(root)) + { + File.WriteAllText(file, newRoot.ToFullString()); + } + } } } @@ -29,9 +76,10 @@ public class NoGamepadsLibrary : ILibrary options.OutputDir = "NoGamepads_Core/Generated"; options.GenerateClassTemplates = false; - var module = options.AddModule("NoGamepads.Native"); + var module = options.AddModule("nogamepads_c"); module.OutputNamespace = "NoGamepads_Sharp"; module.IncludeDirs.Add("NoGamepads_Bindings/Native"); module.Headers.Add("nogamepads_data.h"); } -} \ No newline at end of file +} + diff --git a/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Core/Data/Player.cs b/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Core/Data/Player.cs index a3c3ddd..ec8ebc6 100644 --- a/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Core/Data/Player.cs +++ b/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Core/Data/Player.cs @@ -4,9 +4,39 @@ namespace NoGamepads_Core.Data; public class Player { - private FfiPlayer _ffi = nogamepads_data.PlayerRegister("Fuck", "AAAAA"); + private readonly FfiPlayer _ffi; - public String name + public Player(string account, string password) + { + _ffi = nogamepads_data.PlayerRegister(account, password); + } + + public string NickName + { + get + { + unsafe + { + var get = _ffi.Customize; + return get == null ? "" : PtrStringConverter.ToString(get.Nickname); + } + } + + set => nogamepads_data.PlayerSetNickname(_ffi, value); + } + + public string Id + { + get + { + unsafe + { + return PtrStringConverter.ToString(_ffi.Account.Id); + } + } + } + + public string Hash { get { @@ -16,4 +46,47 @@ public class Player } } } + + public int Hue + { + get => GetHue(); + set => SetHsv(value, Value, Saturation); + } + + public float Value + { + get => GetValue(); + set => SetHsv(Hue, value, Saturation); + } + + public float Saturation + { + get => GetSaturation(); + set => SetHsv(Hue, Value, value); + } + + private void SetHsv(int h, float s, float v) + { + nogamepads_data.PlayerSetHsv(_ffi, h, s, v); + } + + private int GetHue() + { + return _ffi.Customize?.ColorHue ?? 0; + } + + private float GetValue() + { + return (float) (_ffi.Customize?.ColorValue ?? 1f); + } + + private float GetSaturation() + { + return (float) (_ffi.Customize?.ColorSaturation ?? 1f); + } + + public FfiPlayer GetRawPlayer() + { + return _ffi; + } } \ No newline at end of file diff --git a/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Example/Program.cs b/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Example/Program.cs index 6c450f9..c89a220 100644 --- a/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Example/Program.cs +++ b/core/bindings/lang/csharp/NoGamepads_CharpBindings/NoGamepads_Example/Program.cs @@ -1,7 +1,19 @@ -// See https://aka.ms/new-console-template for more information +using NoGamepads_Core.Data; -using NoGamepads_Core.Data; +Player player = new Player("Pzw", "123456") +{ + NickName = "" +}; -Player player = new Player(); +Console.WriteLine("Player hash : " + player.Hash); +Console.WriteLine("Player name : " + player.NickName); -Console.WriteLine(player.name); \ No newline at end of file +player.NickName = "OMG"; + +Console.WriteLine("Player name : " + player.NickName); + +player.Hue = 92; +player.Value = 1; +player.Saturation = 1; + +Console.WriteLine($"Color : H: {player.Hue}, S: {player.Saturation}, V: {player.Value}"); \ No newline at end of file -- cgit