【问题标题】:Go to library to C# | BadImageFormatException转到库到 C# |坏图像格式异常
【发布时间】:2018-05-22 09:49:59
【问题描述】:

我想用 go-code 创建一个库并在 C# winforms 项目中使用它。
错误滚动到底部。

设置

  • 去 1.10.2
  • tdm-gcc-5.1.0-3
  • Windows 10 / x64
  • 调用项目exprt

我的尝试

我创建了一个在工作目录中创建文件的最小 go-tool:

package main

import (
    "os"
    "C"
)

func main() {
    // nothing here
}

//export Test
func Test() {
    os.OpenFile("created_file.txt", os.O_RDONLY|os.O_CREATE, 0666);
}

接下来的步骤来自Building a dll with Go 1.7

然后,我使用以下命令编译为c-archivego build -buildmode=c-archive,这给了我exprt.aexprt.h

之后,我创建了一个名为 goDLL.c 的文件(如上面的链接中的 1:1)并插入了以下代码:

#include <stdio.h>
#include "exprt.h"
// force gcc to link in go runtime (may be a better solution than this)
void dummy() {
    Test();
}
int main() {
}

最后我运行了这个命令来创建我的最终 dll:
gcc -shared -pthread -o goDLL.dll goDLL.c exprt.a -lWinMM -lntdll -lWS2_32 这给了我“goDLL.dll”。

我的问题

在 C# 中,我创建了一个带有 1 个按钮的 winforms 项目,该按钮调用此声明的函数(将 dll 复制到调试文件夹):

[DllImport("goDLL.dll")]
private static extern void Test();

错误

System.BadImageFormatException: "An attempt was made to load a program with an incorrect format. (HRESULT: 0x8007000B)"

很抱歉这么大的文字,但这是我能想到的最小的测试。

感谢这里的每一个帮助。

【问题讨论】:

  • 为什么引用的外部函数的名字是File而不是Test?您得到的错误与 32 位 WOW 与 64 位图像有关,可能是由于 -lWS2_32 编译器标志。两者必须具有相同的位数。
  • @dlatikay 只是一个错字。在我的第一次测试中,两者都被称为File()。编辑了问题。
  • 我只是不明白WS2_32 对应的 64 位..

标签: c# go compilation shared-libraries shared


【解决方案1】:

好吧,在https://social.msdn.microsoft.com/Forums/vstudio/en-US/ee3df896-1d33-451b-a8a3-716294b44b2b/socket-programming-on-64bit-machine?forum=vclanguage这里给出的答案中写着:

实现在一个名为 ws2_32.dll 的文件中,在 64 位 Windows 中有 32 位和 64 位版本的 DLL。

所以我的问题中描述的构建是正确的。

解决方案
C#-Project 必须明确设置为 x64。 AnyCPU 不起作用并抛出上面问题中显示的错误。

现在一切正常。我将留下问题和答案,因为这是对如何让 go-code 用完 C# 的完整说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多