Bizarre System.BadImageFormatException при попытке импортировать C++ dll в C#

Вот соответствующие биты C#

KrautVK.cs

internal static class KrautVK{
    [DllImport("lib\\krautvk", CallingConvention = CallingConvention.Cdecl, EntryPoint = "init")]
    internal static extern int Init(int width, int height, string title, bool fullscreen);

    [DllImport("lib\\krautvk", CallingConvention = CallingConvention.Cdecl, EntryPoint = "windowShouldClose")]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal static extern bool WindowShouldClose();

    [DllImport("lib\\krautvk", CallingConvention = CallingConvention.Cdecl, EntryPoint = "pollEvents")]
    internal static extern void PollEvents();

    [DllImport("lib\\krautvk", CallingConvention = CallingConvention.Cdecl, EntryPoint = "terminate")]
    internal static extern void Terminate();
}

Вот (соответствующий) код C++:

KrautVK.h

#ifndef KRAUTVK_H_
#define KRAUTVK_H_

#include <cstdio>
#include <vector>
#include <iostream>

#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>


#define EXPORT extern "C" __declspec(dllexport)

...

EXPORT int init(int w, int h, char *title, int f);

EXPORT int windowShouldClose();

EXPORT void pollEvents();

EXPORT void terminate();

Я очень хорошо знаю, что System.BadImageFormatException может быть сгенерировано DllImport, если есть несоответствие формата сборки (то есть вызов 32-битного dll из 64-битного приложения). Однако, это не так. Оба построены и предназначены для одного и того же процессора.

После устранения неполадок я обнаружил, что это вызвано исключительно iostream а также vector включает в себя. При удалении этих включений ошибка исчезает, и вызовы работают. На самом деле у меня не было никаких проблем, пока я не начал реализовывать код, который нуждался в этих включениях. Тем не менее, я нуждаюсь в этих включениях, и лучшая часть дневных исследований не нашла документации или объяснений для этого странного поведения, и многие примеры фактически используют iostream,

Я использую оба Jetbrains Rider и Clion, если это возможно.

1 ответ

Решение

Используя Dependency Walker, мне не хватало 3 DLL:

  • libstdC++ - 6.dll
  • libgcc_s_seh-1.dll
  • и libwinpthread-1.dll

Это обязательные библиотеки времени выполнения, если вы используете среду MingW. Сброс их в исполняемую папку сделал свое дело. Их можно найти в {Your MingW/MingW64 installation folder}\bin

Другие вопросы по тегам