Вот соответствующие биты 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, если это возможно.