仕事でプロジェクトがあり、メインプログラムはGolangで書かれており、C# .Net AOTで書かれた共有ライブラリがあります。 。
プロジェクトでは、Golang コードと C# .Net AOT の間で関数を呼び出す必要があります。
具体的な内容は、Golangの関数をコールバック関数としてC#に渡し、C#で呼び出すというものです。しかし、テストしてみると、この機能が正しく動作しないことがわかりました。
これは私のテストコードです:
C# の場合:
リーリーコンパイルコマンド:
dotnet public -p:NativeLib=share -r win-x64 -c debug
コードを実行:
リーリーテスト用に単純な Add(int a, int b) 関数を実装しました。入力パラメータは 1 と 2 で、結果は 3 になるはずですが、そうではありません。デバッグ中に、コールバック関数のパラメータリストが 1 と 2 ではなく、奇妙な数字であることがわかりました。 Stdcall と Cdecl の両方の呼び出し規約を試しましたが、問題を解決できませんでした。
これの理由と解決方法は何ですか?
###デバッグ###これは完全な出力ログです
using System.Runtime.InteropServices; namespace CSharp_Go { public unsafe class Export { private static delegate* unmanaged[Stdcall]<int, int, int> _addDel; [UnmanagedCallersOnly(EntryPoint = "SetAddFunc")] public static void SetAddFunc(delegate* unmanaged[Stdcall]<int, int, int> addDel) { _addDel = addDel; } private static delegate* unmanaged<int> _testFun; [UnmanagedCallersOnly(EntryPoint = "SetTestFunc")] public static void SetTestFunc(delegate* unmanaged<int> testFun) { _testFun = testFun; } [UnmanagedCallersOnly(EntryPoint = "Test")] public static int Test() { int res = _testFun(); Console.WriteLine($"in c# Test res:{res}"); return res; } [UnmanagedCallersOnly(EntryPoint = "Add")] public static int Add(int a, int b) { Console.WriteLine($"in c# Add a:{a}, b:{b}"); int res = 0; if (null != _addDel) { res = _addDel(a, b); Console.WriteLine($"in c# Add res:{res}, a:{a}, b:{b}"); } return res; } } }正解
出力は次のとおりです:
以上がgolang関数を.net aotのコールバック関数として設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。