Bizarre System.BadImageFormatException при попытке импортировать C ++ dll в C # - PullRequest
0 голосов
/ 16 мая 2018

Вот соответствующие биты 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();

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

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

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

1 Ответ

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

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

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

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

...