Ich habe 3 Projekte in einer Lösung.
Ich habe :
- eine native C++ dll,
- eine C# Winform,
- und einen Proxy C++/CLI ohne reinen Modus, um die Verbindung zwischen den anderen 2 Projekten herzustellen (und die nativen Funktionen im verwalteten Code in C# zu verwenden)
Wenn ich die Anwendung starte, funktioniert alles. Aber wenn ich auf die Schaltfläche "Generer" in meinem Winform drücke, die die Funktion NativeMethod::Test() des C++/CLI ausführt, stürzt sie ab und ich erhalte diese Popup-Meldung :
Ein unbehandelte Ausnahme vom Typ 'System.BadImageFormatException' ist in System.Windows.Forms.dll aufgetreten
Zusätzliche Informationen: Die Datei oder Assembly 'EngineInterfaceWrapper.dll' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. n'est pas une application Win32 valide. (Ausnahme von HRESULT: 0x800700C1)
Wenn ich in den Projekteigenschaften unter Conf. Properties -> Linker -> Advanced gehe: Zielmaschine, ist es mit dem Wert "MachineX86" für meine C++ nativen und verwalteten DLLs und meine WinForm ist auch in X86. Ich habe viele Konfigurationen ausprobiert, aber es funktioniert nicht.
Bearbeiten:
Das Problem könnte der Header "TradeEngine.h" in den C++/CLI-Header sein: EngineInterfaceWrapper.h. Denn wenn ich die native C++ Dll trenne (und den gesamten Code im CLI-Wrapper lösche) und die Lösung kompiliere, funktioniert es. Aber wenn "#include "TradeEngine.h"" immer im CLI-Header ist, erhalte ich den gleichen Fehler. Haben Sie eine Idee?
Code :
native C++
TradeEngine.h
#ifdef TRADEENGINE_EXPORTS
#define SYMBOL_DECLSPEC __declspec(dllexport)
#define SYMBOL_DEF
#else
#define SYMBOL_DECLSPEC __declspec(dllimport)
#define SYMBOL_DEF __declspec(dllimport)
#endif
EXTERN_C SYMBOL_DECLSPEC void __stdcall Test(void);
TradeEngine.cpp
SYMBOL_DECLSPEC void __stdcall Test(void)
{
}
C++/CLI
EngineInterfaceWrapper.h
#pragma once
#include "TradeEngine.h"
using namespace System;
using namespace System::Runtime::InteropServices;
namespace EngineInterfaceWrapper {
public ref class NativeMethod
{
public:
static void AjoutColonneDifferenceCourtClotureOuvertureReelle(void);
static void Test();
};
}
EngineInterfaceWrapper.cpp
#pragma region Includes
#include "stdafx.h"
#include "EngineInterfaceWrapper.h"
using namespace EngineInterfaceWrapper;
#include
using namespace msclr::interop;
#pragma endregion
void NativeMethod::Test()
{
::Test();
}
C# Winform
Program.cs
namespace TradeInterface
{
static class Program
{
///
/// Der Hauptzugriffspunkt für die Anwendung.
///
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
Form1.cs
generer_Click() ist das Ereignis, das durch die Schaltfläche ausgelöst wird, wenn der Benutzer auf Generer klickt.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using EngineInterfaceWrapper;
namespace TradeInterface
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void generer_Click(object sender, EventArgs e)
{
NativeMethod.Test();
}
}
}
Wie kann ich das beheben? Wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen.