通过 Windows Powershell 调用 go c 共享 dll 后,没有来自可执行文件的标准输出

问题描述

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

我做了什么?

我使用一个导出函数 (HelloWorld) 交叉编译了我可以用于 Windows 的最简单的 c 共享 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 提示符执行进一步的控制台命令,例如“主机名”或“ipconfig”等

我看到了什么?

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

例如最初 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-shared dll 以某种方式导致 stdout 被重定向或无法正确显示?或者关于要中断的 PS 会话的编码?

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

有什么想法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)