5 Stimmen

C++/CLI Dll mit C# Verbindungsproblem

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.

8voto

Seçkin Durgay Punkte 2632

Ich habe die Lösung gefunden:

http://marc.info/?l=boost-users&m=123425857320026

In Konfigurationseigenschaften -> C/C++ -> Präprozessor -> Präprozessor Definitionen füge BOOST_ALL_DYN_LINK hinzu, um die Verwendung der DLLs zu erzwingen. Kopiere außerdem die erforderlichen DLLs in das Verzeichnis, in dem die ausführbare Datei liegt. Z.B. kopiere boost_thread-vc90-mt-gd-1_XX.dll nach MyApp/bin/Debug.

4voto

InBetween Punkte 31712

Ein Grund könnte sein, dass Sie versuchen, eine native 32-Bit-DLL in einem 64-Bit-Prozess zu laden. Stellen Sie sicher, dass das Zielplattform auf x86 festgelegt ist in Ihrer App, um Ihre Anwendung dazu zu zwingen, innerhalb von WoW64 ausgeführt zu werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X