尝试将C ++ dll导入C#时,Bizarre System.BadImageFormatException

时间:2018-05-16 00:05:09

标签: c# c++ dllimport

这是相关的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();

我非常清楚,如果构建格式不匹配(即从64位应用程序调用32位dll),DllImport可以抛出System.BadImageFormatException。然而,这种情况并非如此。两者都构建并针对相同的CPU。

在进行一些故障排除后,我发现它仅由iostreamvector包含。通过删除这些包含,错误消失并且调用工作。事实上,在我开始实现需要这些包含的代码之前,我没有遇到任何问题。但是,我需要那些包含,并且一天中最好的部分研究没有为这种奇怪的行为提供任何文档或解释,事实上很多例子都使用iostream

我使用Jetbrains Rider和Clion,如果那是相关的。

1 个答案:

答案 0 :(得分:0)

使用Dependency Walker,我错过了3个dll:

  • 的libstdc ++ - 6.dll
  • libgcc_s_seh-1.DLL
  • 和libwinpthread-1.dll

如果您使用MingW环境,它们是必需的运行时库。将它们放入可执行文件夹就可以了。它们可以在{Your MingW/MingW64 installation folder}\bin

中找到