Funktionen aus C# Dll in C++ nutzen
-
Hallo ich versuche verzweifelt eine C# dll in C++ zum laufen zu bekommen. Mein problem ist das die C# Dlls ja kein dllname.lib haben so das ich das net laden kann deshalb bekomme ich bei diesem Code einen error:
// Testdll.cpp: Hauptprojektdatei. #include "stdafx.h" #include <iostream> #include "windows.h" #using <ClassLibrary1.dll> using namespace std; using namespace System; // Importieren der Funktion aus der oben erstellten DLL extern "C" __declspec(dllimport)int Rechnen (int a, int b); int main () { // Aufrufen der externen Funktion int result = Rechnen(1, 2); printf("Das Ergebnis ist: %f\n", result); return 0; }
Weiß jemand wie ich das machen könnte ? dll source von C# dll:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Addierer { public class Addieren { public int Rechnen(int a, int b) { return a + b; } } }
-
Das geht so nicht. Du musst z.B. über C++/CLI oder COM gehen.
Schau mal den Beitrag und das Bsp. von mir an (WindowsEnumerator):
http://www.c-plusplus.net/forum/viewtopic-var-t-is-241810-and-postdays-is-0-and-postorder-is-asc-and-start-is-10.htmlVielleicht hilft Dir das.
Generell stellt sich aber die Frage: Lohnt sich der Aufwand?
Simon
-
Was für ein wirres Durcheinander ...
Soll das C++ oder C++/CLI werden ?
Warum
#include <iostream> // ... using namespace std;
und dann die Ausgabe mit printf ?
Sieht aus wie einfach per Copy&Paste zusammengeklickt ...
Und zur Lösung deines Problems:
Da ist eine Klasse Addieren in deiner C#-DLL. Du musst in C++/CLI ein Objekt davon anlegen und dessen Methode Rechnen aufrufen.
Und wenn es doch C++ und nicht C++/CLI sein sollte: Vergiss es, so komplizierte Kopiervorlagen wirst du hier nicht finden.
-
Joa das ist in der Tat zusammen gefügt ich hatte es voher noch anders Probiert und dafür iostream genommen^^ Der andere Code ist scho ausm netzt aber mehr nützliches sinvolles habe ich nicht gefunden
-
Du mixt hier die Konzepte von CLI und den nativen DLL's
Prinzipiell ist das im .Net sehr einfach um zu setzten. Dafür kannst du AFAIK nicht einfach eine Funktion
int rechnen(int a,int b)
importieren sondern nur ganze Klassen
Im grunde schreibst du einfach in C# deine Klasse (ggf. eine Statische).
Diese machst du einfach Public und erzeugst daraus die dll.Diese dll nutzt du einfach in deinen C++ CLI projekt (entweder bei den Projektreferenzen die dll angeben oder
#using "mydll.dll"
damit ist die entsprechende Klasse auch automatisch im Projekt verfügbar. Man muss halt noch den namespace mit angeben.
z.B.:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Addierer { public static class Addieren { public static int Rechnen(int a, int b) { return a + b; } } }
#using "Addierer.dll" //Namespace addierer (um direkt auf Addieren zuzugreifen) using namespace Addierer; int main () { // Aufrufen der externen Funktion int result = Addieren::Rechnen(1, 2); std::cout<<"Das Ergebnis ist: "<<result<<std::endl; return 0; }
-
Danke ! das wars 1000 dank du bist der einzigste der nicht dumm rum gesapmmt hat und wenigstens geholfen hat =). Nochmals vielen dank!
-
hamburger schrieb:
Danke ! das wars 1000 dank du bist der einzigste der nicht dumm rum gesapmmt hat und wenigstens geholfen hat =). Nochmals vielen dank!
Ahja? Hättest Du gelesen, was ich geschrieben habe, hättest Du dein Problem schön längstens lösen können.
Simon
-
Sry das hatte ich überlesen dann nochmal einen dank an dich! Nun habe ich ein weiteres Problem. Die Dll returnt ein Array. Ich weiß aber nicht welche value ich in C++ angeben soll. Es ist ein String array
-
Du hast Zeiten 01:07 *gg*
Ich glaube da gabs ArraySystem::string ich schau aber selbst nochmal genau nach.Edit:
array<System::string^>^
der Zugriff sollte genauso wie in C# gehen
array<System::string^>^ arr = myFunctionThatReturnsArray(); arr[1] = "Foo"; fore ach(string^ str in arr) { System::Console::WriteLine(str); }
hoffe das hilft.
-
2x grosses S bei System::String und "for each" statt "fore ach"
-
Jop danke nu ist alles fertig vielen dank an alle die geholfen haben