Перейти в библиотеку на C # |BadImageFormatException - PullRequest
0 голосов
/ 22 мая 2018

Я хотел бы создать библиотеку из go-кода и использовать ее в проекте winforms C #.
Для ошибки прокрутите вниз.

Настройка

  • GO 1.10.2
  • tdm-gcc-5.1.0-3
  • Windows 10 / x64
  • Go-проект под названием exprt

То, что я пробовал

Я создал минимальный инструмент go, который создает файл в рабочем каталоге:

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);
}

Следующие шаги были сделаны из Создание библиотеки DLL с помощью Go 1.7 .

Затем я скомпилировал в c-archive сследующая команда: go build -buildmode=c-archive, которая дает мне exprt.a и exprt.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 # я создал winforms-проект с 1 кнопкой, которая вызывает эту объявленную функцию (скопировал 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)"

Извините за большой блок текста, но этобыл самый минимальный тест, который я мог придумать.

Я ценю любую помощь здесь.

1 Ответ

0 голосов
/ 22 мая 2018

Ну, в данном ответе здесь https://social.msdn.microsoft.com/Forums/vstudio/en-US/ee3df896-1d33-451b-a8a3-716294b44b2b/socket-programming-on-64bit-machine?forum=vclanguage написано:

Реализация находится в файле с именем ws2_32.dll и существует 32-битная и 64-битная версииDLL в 64-битной Windows.

Таким образом, сборка, как описано в моем вопросе, правильна.

Решение
C # -Проектбыть явно установленным на x64.AnyCPU не сработает и выдает ошибку, показанную в вопросе выше.

Теперь все работает.Я оставляю вопрос и ответ, так как это полное объяснение того, как получить go-код из C #.

...