提问者:小点点

尝试将C dll导入C#时的奇怪System. BadImageFormatException


以下是相关的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。

经过一些故障排除,我发现它完全是由iostream向量包含引起的。通过删除这些包含,错误消失了,调用正常工作。事实上,在我开始实现需要这些包含的代码之前,我没有遇到任何问题。然而,我需要这些包含,一天的大部分研究都没有发现这种奇怪行为的留档或解释,许多示例实际上使用了iostream

如果这是相关的,我正在使用喷气大脑骑士和Clion。


共1个答案

匿名用户

使用依赖沃克,我错过了3个dll:

  • libstdc-6. dll
  • libgcc_s_seh-1. dll
  • 和libwinpthread-1. dll

如果您使用明W环境,它们是必需的运行时库。将它们放入可执行文件夹中就成功了。它们可以在{您的明W/明W64安装文件夹}\bin中找到

相关问题