热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:使用系统调用调用mono2.0sgen.dll获得“不是有效的Win32应用程序”

篇首语:本文由编程笔记#小编为大家整理,主要介绍了使用系统调用调用mono-2.0-sgen.dll获得“不是有效的Win32应用程序”相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了使用系统调用调用mono-2.0-sgen.dll获得“不是有效的Win32应用程序”相关的知识,希望对你有一定的参考价值。



我想通过Go运行带有Mono Framework的HelloWorldConsole.exe。

所以我想调用mono-2.0-sgen.dll函数“mono_main”来执行exe。 mono-2.0-sgen.dll是MS Windows的可执行文件,see。

但我收到错误“不是一个有效的Win32应用程序”

_ = os.Setenv("MONO_PATH", `monolibmono4.5;C:DEVHelloWorldConsoleHelloWorldConsoleinDebug`)
_ = os.Setenv("MONO_CFG_DIR", `"C:Program Files (x86)Monoetc"`)
_ = os.Setenv("MONO_CONFIG", `"C:Program Files (x86)Monoetcmonoconfig"`)
mono := `C:Program Files (x86)Monoinmono-2.0-sgen.dll`
app := `C:DEVHelloWorldConsoleHelloWorldConsoleinDebugHelloWorldConsole.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()

功能名称

mono-2.0-sgen.dll

完全错误:

panic: Failed to load C:Program Files (x86)Monoinmono-2.0-sgen.dll: %1 is **not a valid Win32 application**.

答案

%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_FORMATmeans你在x64进程中调用x86 dll。您必须使用Go的x86变体,例如来自https://golang.org/dl/的go1.12.1.windows-386.zip。

现在必须将GOROOT和PATH更改为提取的bin文件夹,然后您就可以开始了。


Type of Arguments

当你调用mono_main时,你需要以正确的方式使用这个函数。如果你看看implementation,你会看到签名是int mono_main (int argc, char* argv[]);。 argc和argv是一个广泛使用的模式,请参阅here。


Working Sample

func main() {
_ = os.Setenv("MONO_PATH", `C:DEVHelloWorldConsoleHelloWorldConsoleinx86Debugmonolibmono4.5;C:DEVHelloWorldConsoleHelloWorldConsoleinx86Debug`)
_ = os.Setenv("MONO_CFG_DIR", `C:DEVHelloWorhpm.goldConsoleHelloWorldConsoleinx86Debugmonoetc`)
_ = os.Setenv("MONO_CONFIG", `C:DEVHelloWorldConsoleHelloWorldConsoleinx86Debugmonoetcmonoconfig`)
_ = os.Chdir(`C:DEVHelloWorldConsoleHelloWorldConsoleinx86Debug`)
mono := `C:DEVHelloWorldConsoleHelloWorldConsoleinx86Debugmonoinmono-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 argummentData [260]byte
ptr := unsafe.Pointer(&argummentData)
copy(argummentData[:], dotNetAssembly)
args := [2]uintptr{0, uintptr(ptr)}
_, _, _ = lazyProc.Call(2, uintptr(unsafe.Pointer(&args)))
}


推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • OpenCV4.5.0+contrib编译流程及解决错误方法
    本文介绍了OpenCV4.5.0+contrib的编译流程,并提供了解决常见错误的方法,包括下载失败和路径修改等。同时提供了相关参考链接。 ... [详细]
  • 点此学习更多SQL相关函数与字符串处理函数mysql函数一、简明总结ASCII(char)        返回字符的ASCII码值BIT_LENGTH(str)      返回字 ... [详细]
  • 从零开始的ESP8266探索(15)WiFi其他方法和WiFi事件响应
    文章目录目的WiFi其他方法WiFi事件响应事件列表注册事件使用示例总结目的WiFi在使用过程中并非会一直如希望般稳定运行的,为了应对这些情况就需要能够了解WiFi ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • faster rcnn如何生成anchors
       本文就fasterrcnn中anchors的函数generate_anchors.py为例,介绍anchors的生成过程。   首先看下主函数入口。论文中提到a ... [详细]
author-avatar
杜甜甜Athena15
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有