Вызов функции из Go в C # - PullRequest
2 голосов
/ 30 апреля 2019

Я пытаюсь создать DLL-файл из Golang для использования в скрипте C #.Тем не менее, я не могу заставить работать простой пример.

Вот мой код Go:

package main

import (
    "C"
    "fmt"
)

func main() {}

//export Test 
func Test(str *C.char) {
    fmt.Println("Hello from within Go")
    fmt.Println(fmt.Sprintf("A message from Go: %s", C.GoString(str)))
}

Вот мой код C #:

using System;
using System.Runtime.InteropServices;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello");
            GoFunctions.Test("world");
            Console.WriteLine("Goodbye.");
        }
    }


    static class GoFunctions
    {
    [DllImport(@<path to test.dll>, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
    public static extern void Test(string str);
    }
}

I 'м здание dll из:

go build -buildmode=c-shared -o test.dll <path to go file>

Выход

Hello
Hello from within Go
A message from Go: w

panic: runtime error: growslice: cap out of range

1 Ответ

0 голосов
/ 14 мая 2019

Он работает с byte[] вместо string, то есть со следующим кодом C #:

using System;
using System.Runtime.InteropServices;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello");
            GoFunctions.Test(System.Text.Encoding.UTF8.GetBytes("world"));
            Console.WriteLine("Goodbye.");
        }
    }


    static class GoFunctions
    {
    [DllImport(@<path to test.dll>, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
    public static extern void Test(byte[] str);
    }
}

Я не уверен, почему string здесь не работает.

...