ホームページ  >  記事  >  バックエンド開発  >  golang関数を.net aotのコールバック関数として設定する方法

golang関数を.net aotのコールバック関数として設定する方法

WBOY
WBOY転載
2024-02-05 22:06:081041ブラウズ

如何将golang函数设置为.net aot的回调函数

質問内容

仕事でプロジェクトがあり、メインプログラムは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;
        }
    }
}

正解

Go 関数をエクスポートするには cgo を使用する必要があります
リーリー

出力は次のとおりです:

以上がgolang関数を.net aotのコールバック関数として設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。