dqsxsmi3704 2019-04-30 02:04
浏览 166
已采纳

在C#中从Go调用函数

I'm trying to make a .dll file from Golang to be used in a C# script. However, I can't make a simple example work.

Here is my Go code:

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)))
}

Here is my C# code:

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'm building the dll from:

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

The output is

Hello
Hello from within Go
A message from Go: w

panic: runtime error: growslice: cap out of range
  • 写回答

1条回答 默认 最新

  • douqiangchuai7674 2019-05-14 01:44
    关注

    It works with byte[] instead of string, that is, with the following C# code:

    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);
        }
    }
    

    I'm not sure why string does not work here though.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 comsol稳态求解器 找不到解,奇异矩阵有1个空方程返回的解不收敛。没有返回所有参数步长;pid控制
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题
  • ¥35 beats蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功