C DLL in .Net CLI einbinden
-
Hallo, ich habe eine DLL in C vorliegen, und möchte die in mein CLI Projekt einbinden. Nur habe ich keine Ahnung wie ich das am besten bewerkstelligen soll.
Wenn ich den header eingebunden habe, compiliert der erstmal. Aber meine Datentypen sind ja alle mangaged bspw. Listen. Wie gehe ich denn am besten mit den folgenden Funktionsaufrufen um? Da könnte ich es mir für die anderen ableiten.
__declspec(dllexport) unsigned long function1 (unsigned long n, unsigned long k); __declspec(dllexport) int function2(double* pVal_1, double* pVal_2, unsigned long val3);
Meine Idee war erst eine Klasse drumherum zuschreiben, aber ich bin mir nicht so sicher wie ich das sauber umsetzen könnte. Wenn jemand da mal ein Minibeispiel zeigen könnte wäre mir sicher sehr geholfen.
Vielen Dank im voraus
Bernd
-
Ev. hilft Dir mein Mini Bsp. in folgendem Post (Windows Enumerator):
http://www.c-plusplus.net/forum/viewtopic-var-t-is-241810-and-postdays-is-0-and-postorder-is-asc-and-start-is-10.htmlSimon
Edit:
Meine Idee war erst eine Klasse drumherum zuschreiben
Tönt vernünftig.
aber ich bin mir nicht so sicher wie ich das sauber umsetzen könnte.
Zeig mal was Du hast.
-
Hi, also ich habe das jetzt so gestaltet:
ref class Bibliothek { public: Bibliothek(void); public: int Bibo_function1(List<double>^ pVal1, List<double>^ pVal2, unsigned long val3); };
cpp
int Bibliothek::Bibo_function1(List<double>^ pVal1, List<double>^ pVal2, unsigned long val3) { //Hier ist der Punkt wo ich nicht weis wie es geht :D return function1(umwandeln von val1, Ergebnis steht in pVal2, val3) }
Bernd
-
Hier ein kleines Bsp:
Managed
#include "stdafx.h" #include "Multiply.h" using namespace System; int main(array<System::String ^> ^args) { array<double>^ values = gcnew array<double>(3); values[0] = 27; values[1] = 28; values[2] = 29; pin_ptr<double> pValues = &values[0]; native::multiply(pValues, values->Length, 2); return 0; }
Native
Multiply.h
#pragma once namespace native { void multiply(double* pValues, size_t count, double factor); }
Multiply.cpp
#include "stdafx.h" #include "Multiply.h" void native::multiply(double* pValues, size_t count, double factor) { for (size_t index = 0; index < count; ++index) { double& value = pValues[index]; value *= factor; } }
-
Hi vielen Dank für das Beispiel.
Mit dem pin_ptr habe ich mich schon ein wenig befasst. Ich werde es mal morgen so umsetzen. Ich sehe du verwendest ein managed Array ist das denn auch mit einer managed List möglich?
Weil wenn ich so etwas mache
List<double>^ values... pin_ptr<double> pValues = &values[0]; //Fehler ... muß ein Lvalue sein
Ich wollte nicht unbedingt toArray verwenden, da ja jedesmal die Daten umgeschichtet werden. Ist es denn möglich mit einer Liste das ganze zu machen?
Wenn nicht muss ich wohl meine Struktur auf array abändern...
Mfg Bernd
-
Ich denke nicht, dass es ein direkter Weg von List<double>^ zu double* gibt - bleibt also vermutlich nur List<T>::ToArray().
-
Hi vielen Dank, das klappt wunderbar. Ich werde meine Softwarestruktur auf arrays umstellen dann brauch auch nichts hin und her kopiert werden mit toArray().