通过Windows Powershell对go c-shared dll进行pinvoke后,可执行文件中没有标准输出

通过Windows Powershell对go c-shared dll进行pinvoke后,可执行文件中没有标准输出,powershell,go,stdout,pinvoke,Powershell,Go,Stdout,Pinvoke,这是一个奇怪的例子——通过Powershell从golang c-shared dll对一个函数进行了一次又一次的pinvoke,随后执行的可执行文件(例如hostname.exe、ipconfig等)没有显示到stdout的输出。只有在powershell调用dll函数时才会发生这种情况(Windows上的python不会重现此问题) 我做了什么? 我用一个导出的函数(HelloWorld)交叉编译了最简单的c-shared dll。然后我从Powershell调用了dll go代码是: pa

这是一个奇怪的例子——通过Powershell从golang c-shared dll对一个函数进行了一次又一次的pinvoke,随后执行的可执行文件(例如hostname.exe、ipconfig等)没有显示到stdout的输出。只有在powershell调用dll函数时才会发生这种情况(Windows上的python不会重现此问题)

我做了什么?

我用一个导出的函数(HelloWorld)交叉编译了最简单的c-shared dll。然后我从Powershell调用了dll

go代码是:

package main

import "C"
import (
        "fmt"
)

//export HelloWorld
func HelloWorld() {
        fmt.Println("Hello World")
}

func main() {}
使用的生成命令(来自linux)是:

GOARCH=amd64 GOOS=windows CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build -v -buildmode=c-shared -o helloworld.dll .
然后,我将生成的.dll复制到Windows,并使用以下Powershell脚本调用HelloWorld()函数:

$signature = @"
[DllImport("c:\\cshared\\helloworld.dll")]
public static extern void HelloWorld();
"@

Add-Type -MemberDefinition $signature -Name World -Namespace Hello

[Hello.World]::HelloWorld()
我期望看到什么?

我希望dll的HelloWorld()函数能够成功调用(导致文本“Hello World”写入控制台),然后我希望能够使用powershell提示符执行更多控制台命令,如“hostname”或“ipconfig”等

我看到了什么?

这真的很奇怪。HelloWorld()函数确实执行成功,我在控制台上看到文本“Hello World”。但是,调用该函数后,我无法再在powershell窗口中看到来自cmd.exe命令的任何控制台输出。例如,调用“hostname”只返回没有输出的结果,“ipconfig”也是如此

e、 g.最初hostname.exe工作并提供输出,但在执行cshared dll后,我无法在控制台上看到hostname..exe的任何进一步输出:

PS C:\cshared> hostname
nick-host
PS C:\cshared> hostname
nick-host
PS C:\cshared> .\helloworld.ps1
Hello World
PS C:\cshared> hostname
PS C:\cshared> ipconfig
PS C:\cshared> hostname
如果我将hostname.exe的输出通过管道传输到一个文件(例如“hostname>out.txt”),那么我可以确认输出是否存在,并且命令是否成功(如果将可执行命令通过管道传输到“out-Host”cmdlet,也会发生同样的情况)…因此,执行c共享dll似乎会以某种方式导致stdout重定向或无法正确显示?或者PS会话的编码要中断

我试图从go代码中删除fmt.Println,看看这是否有帮助,但问题仍然是一样的。我也只在Powershell中看到了这一点(如果我做了同样的实验,但在Windows上从python调用helloworld.dll,那么在以后的shell中我看不到任何问题)


有什么想法吗?

这已被Windows控制台所有者确认为golang本身的一个bug。go issue线程位于此处: