?
So nach langem hin und her habe ich es endlich geschafft. Vielen Dank für die Unterstützung aus dem Forum.
Für die Nachwelt hier meine Lösung. Falls es anders oder besser geht, könnt ihr das gerne äußern.
Meine Projektmappe besteht jetzt aus folgenden Komponenten:
-Interface
-TestanwendungC
Mein Interface(Dll) habe ich nicht verändert. Diese ist immernoch in /clr geschrieben. Folgende Dateien sind enthalten:
Interface.h
Interface.cpp
InputValues.h
InputValues.cpp
OutputValues.h
OutputValues.cpp
Interface.h:
// Interface.h
#pragma once
#include "InputValues.h"
#include "OutputValues.h"
using namespace System;
namespace Interface {
public ref class Interface
{
public:
static int Calc(
InputValues ^actualConditions,
InputValues ^referenceConditions,
OutputValues ^outputValues);
};
}
Interface.cpp:
#include "stdafx.h"
#include "Interface.h"
using namespace System;
namespace Interface
{
int Interface::Calc(
InputValues ^ actualConditions,
InputValues ^ referenceConditions,
OutputValues ^ outputValues)
{
return 0;
}
}
InputValues.h:
#pragma once
using namespace System;
namespace Interface
{
public ref class InputValues
{
double var1;
int var2;
int Type;
public:
// Constructor
InputValues(
double var1,
int var2,
int Type
);
};
}
OutputValues.h:
#pragma once
namespace Interface
{
public ref class DynOutputValues
{
double PowerActual;
double PowerReference;
public:
OutputValues(void);
// Properties
property double Power
{
double get();
}
property double PowerActual
{
void set(double PowerActual);
}
property double PowerReference
{
void set(double PowerReference);
}
};
}
Im Kontextmenü der TestanwendungC habe ich unter Verweise das Interface eingebunden. Weiterhin als Startprojekt festgelegt (Kontextmenü).
Im Projekt der Testanwendung gibt es 3 Files:
-TestanwendungC.cpp
-DllLinking.h
-DllLinking.cpp
TestanwendungC.cpp:
#include "stdafx.h"
#include <iostream>
#include "DllLinking.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
DllLinking LinkToInterface;
return 0;
}
DllLinking.h:
#pragma once
class DllLinking
{
public:
DllLinking();
};
DllLinking.cpp:
#include "DllLinking.h"
#pragma managed
DllLinking::DllLinking()
{
using namespace System;
using namespace Interface;
// Create actualConditions object
InputValues ^ actualConditions = gcnew InputValues(
1000
1
1
);
// Create referenceConditions object
InputValues ^ referenceConditions = gcnew InputValues(
1200,
0,
1
);
OutputValues ^ outputValues = gcnew OutputValues();
// Call Dll to run dyn and to report Values
int returnCode = Interface::Calc( actualConditions, referenceConditions, outputValues);
// Check Dll Call
Console::WriteLine("Power sollte 1 sein und beträgt: " + outputValues->Power);
}
Unter Eigenschaften der DllLinking.cpp musste ich folgendes einstellen:
C/C++->Allgemein->Debuginformationsformat->Programmdatenbank (Zi)
C/C++->Allgemein->Common Language Runtime-Unterstützung->Common Language Runtime-Unterstützung (/clr)
C/C++->Codegenerierung->C++-Ausnahmen aktivieren->Ja bei SEH-Ausnahmen (/EHa)
C/C++->Codegenerierung->Vollständige Laufzeitüberprüfung->Standard
Nochmals vielen Dank, und für Vorschläge und Verbesserungen habe ich ein offenes Ohr.