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