[英]System.BadImageFormatException when use C# call C++
[英]Bizarre System.BadImageFormatException when trying to import C++ dll into 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();
我非常清楚,如果存在構建格式不匹配(即從64位應用程序調用32位dll),則DllImport可以拋出System.BadImageFormatException
。 然而,這種情況並非如此。 兩者都構建並針對相同的CPU。
在做了一些故障排除之后,我發現它只是由iostream
和vector
包括引起的。 通過刪除這些包含,錯誤消失並且調用工作。 事實上,在我開始實現需要這些包含的代碼之前,我沒有遇到任何問題。 然而,我需要那些包含,並且一天的研究中更好的部分沒有發現這種奇怪的行為的文檔或解釋,並且許多例子實際上使用iostream
。
我正在使用Jetbrains Rider和Clion,如果這是相關的。
使用Dependency Walker,我錯過了3個dll:
如果您使用MingW環境,它們是必需的運行時庫。 將它們放入可執行文件夾就可以了。 它們可以在{Your MingW/MingW64 installation folder}\\bin
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.