![](/img/trans.png)
[英]Running unit test in golang error: %1 is not a valid win32 application
[英]Call mono-2.0-sgen.dll with syscall got "not a valid Win32 application"
我想通過 Go 使用隨附的 Mono 框架執行 HelloWorldConsole.exe。
所以我想調用mono-2.0-sgen.dll函數“mono_main”來執行exe。 mono-2.0-sgen.dll 是 MS Windows 的 PE32 可執行文件, 請參閱。
但我收到錯誤“不是有效的 Win32 應用程序”
_ = os.Setenv("MONO_PATH", `\mono\lib\mono\4.5;C:\DEV\HelloWorldConsole\HelloWorldConsole\bin\Debug`)
_ = os.Setenv("MONO_CFG_DIR", `"C:\Program Files (x86)\Mono\etc"`)
_ = os.Setenv("MONO_CONFIG", `"C:\Program Files (x86)\Mono\etc\mono\config"`)
mono := `C:\Program Files (x86)\Mono\bin\mono-2.0-sgen.dll`
app := `C:\DEV\HelloWorldConsole\HelloWorldConsole\bin\Debug\HelloWorldConsole.exe`
fmt.Println("Execute")
var mod = syscall.NewLazyDLL(mono)
var proc = mod.NewProc("mono_main")
ret, _, _ := proc.Call(0,
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("mono.exe"))),
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(app))) )
與windows.NewLazySystemDLL
行為相同
dll := windows.NewLazySystemDLL(mono)
lazyProc := dll.NewProc("mono_main")
lazyProc.Call()
函數名稱
完整錯誤:
panic: Failed to load C:\Program Files (x86)\Mono\bin\mono-2.0-sgen.dll: %1 is **not a valid Win32 application**.
錯誤%1 is not a valid Win32 application
是 Windows 本身對 Win32 錯誤代碼的描述。
Win32 錯誤代碼本身是0x000000C1 ERROR_BAD_EXE_FORMAT
,請參閱docs.microsoft.com 。
BAD_EXE_FORMAT
意味着您在 x64 進程中調用 x86 dll。 您必須使用 Go 的 x86 變體,例如https://golang.org/dl/ 中的go1.12.1.windows-386.zip。
現在必須將 GOROOT 和 PATH 更改為解壓縮的 bin 文件夾,然后您就可以開始了。
當您調用mono_main
您需要以正確的方式使用 this 函數。 如果你看一下實現,你會發現簽名是int mono_main (int argc, char* argv[]);
. argc 和 argv 是一種廣泛使用的模式,請參見此處。
func main() {
_ = os.Setenv("MONO_PATH", `C:\DEV\HelloWorldConsole\HelloWorldConsole\bin\x86\Debug\mono\lib\mono\4.5;C:\DEV\HelloWorldConsole\HelloWorldConsole\bin\x86\Debug\`)
_ = os.Setenv("MONO_CFG_DIR", `C:\DEV\HelloWorhpm.goldConsole\HelloWorldConsole\bin\x86\Debug\mono\etc`)
_ = os.Setenv("MONO_CONFIG", `C:\DEV\HelloWorldConsole\HelloWorldConsole\bin\x86\Debug\mono\etc\mono\config`)
_ = os.Chdir(`C:\DEV\HelloWorldConsole\HelloWorldConsole\bin\x86\Debug\`)
mono := `C:\DEV\HelloWorldConsole\HelloWorldConsole\bin\x86\Debug\mono\bin\mono-2.0-sgen.dll`
// https://github.com/mono/mono/blob/c5b88ec4f323f2bdb7c7d0a595ece28dae66579c/mcs/tools/mkbundle/template_main.c#L1
dll := windows.NewLazySystemDLL(mono)
lazyProc := dll.NewProc("mono_main")
dotNetAssembly := []byte(`HelloWorldConsole.exe`)
var argumentData [260]byte
ptr := unsafe.Pointer(&argumentData)
copy(argumentData[:], dotNetAssembly)
args := [2]uintptr{0, uintptr(ptr)}
_, _, _ = lazyProc.Call(2, uintptr(unsafe.Pointer(&args)))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.