ref class mit unter Klassen erstellen

FJK

Erfahrenes Mitglied
Hallo,

ich versuche mir in c++ (Visual Studio 10) aus einen CLR Projekt eine dll zu erstellen, damit ich diese in einer .net Umgebung verwenden kann.
Nun das Klappt soweit auch alles ohne Probleme. Damit ich die Methoden und co auch später aufrufen kann, muss ich die Klassen mit ref erzeugen. Da meine Klasse aber andere Bibliotheken verwendet bekomme ich jedesmal unzählige Fehlermeldungen wenn ich das Zauberwort ref verwende.

Code:
public ref class Test

Beispiel eines Fehlers...
error C3699: "*": Diese Referenzierung kann nicht für den Typ "Test" verwendet werden.
1> Der Compiler ersetzt "*" durch ^", um die Analyse fortzusetzen.
Diese Fehler beziehen sich alle auf Zeiger und Listen.
Ohne "ref" funktioniert die Klasse, nur kann ich sie dann nicht als dll verwenden wie ich es möchte.


ich schätze mal er muss alle Zeiger ändern da er durch "ref" auf dem Heap arbeitet. Nun kann ich aber nicht die gesamten Bibliotheken ändern, gibt es da eine einfachere Methode?


könnt ihr mir helfen?
 
Zuletzt bearbeitet:
Hi.

Du müßtest eine .NET Wrapper Bibliothek schreiben, in der du deine vorhandene Klasse benutzt.

C++:
public ref class RefTest {

  Test* m_native; // <<= einfach die "normale" Klasse benutzen

public:
  /* für jede öffentliche Methode von Test
       eine äquivalente Wrapper-Methode in dieser Klasse
       definieren, welche einfach den Aufruf an die m_native
       Instanz weiterleitet. */

  void method1(T x) {
    m_native->method1(x);
  }
  ...
};
 
Du hast warscheinlich sowas hier gemacht:
C++:
//...
public ref class Test { /* Klassencode */ };
//...
Test* pTest;

Der Fehler ist ganz einfach. Für Managed Types wurden besondere "Pointer-operatoren" eingebaut. wenn du eine Referenz haben willst, also einen Pointer auf mt, dann benutze ^ anstatt *. du kannst den *-Pointer auf Managed Types nur machen, wenn es sich um strukturen handelt, also "public value class Test".

C++ CLI ist schon ne wirre Sache, obwohl C++ an sich schon wirr genug sein kann.

Mfg
JustShinigami
 
Wie gesagt, ich habe ein Bildverarbeitungsprogramm das ich in c++ mit bestimmten Libs (die es nur für c++ gibt) geschrieben habe. Nun muss/will ich das bestehende Programm in einen anderen C# Application einbinden. Hierfür hatte ich mir drei Möglichkeiten ausgedacht:
- per dll/lib... einbinden
- das c++ Programm aus c# aufrufen
- per tcp-socket

die letzten beiden erschienen mir aber als sehr unsauber.

Da ich eine nicht von mir geschriebene Lib benutze, kann ich die Zeiger nicht alle ändern.
gibt es noch eine andere Möglichkeit?
 
Zuletzt bearbeitet:
Ok hab mich jetzt nochmal rangesetzt und konnte die DLL erstellen.
Konnte auch eine einfache (ohne Klasse) in c# einbinden, jetzt habe ich aber ein Problem mit den Klassen;

Code:
public class Test
{
[DllImport("DieDLL.dll")]
public static extern void Der_Konstruktor(int Irgendwas);

[DllImport("DieDLL.dll")]
public static extern int get_Ausgabe();
}

Aufruf:
Code:
Test.Der_Konstruktor(2);
int a = Test.get_Ausgabe();

Hier kommt Logischerweise die Fehlermeldung: das keine Einstiegspukt gefunden werden konnte. Was ja auch Logisch ist, denn der aufruf müsste ja eigendlich irgendwie so aussehen:
Code:
Test EinTest = new Test();
Test.Der_Konstruktor(2);
int a = Test.Get_Ausgabe();
(ich weiß das der Code falsch ist...)

Damit der Zeiger m_native noch existent ist, oder?
 
Zuletzt bearbeitet:
habs gelöst danke
einfach die .dll als Verweis dem Projekt hinzufügen und direkt die Wrapperklasse benutzen.
 

Neue Beiträge

Zurück