Referenzen in Delegates **gelöst**
-
Hi Leute,
ich habe in einer CLI/C++ Klasse (wird Dll) ein Delegate Definiert.
public delegate void delDllResultHandler(tResultFlag ResultFlag, tExtendedResultFlag ExtendedResultFlag, tDllResultListEntry ^rResultListEntry);
diesen möchte ich in c# benutzen
public delegate void delDllResultHandler(tResultFlag ResultFlag, tExtendedResultFlag ExtendedResultFlag, tResultListEntry ^rResultListEntry); Read.OnDllResultHandler += new DllDotNet.delDllResultHandler(DllResultHandler);
er erkennt das ^ bei der Funktionsdefinition nicht:
Fehler CS1001: Bezeichner erwartet
Fehler CS1519: Ungültiges Token ")" in Klasse, Struktur oder Schnittstellenmemberdeklaration.MfG
-
Was heisst bei Dir "in C# nutzen"? Portieren nach C# oder nur benutzen?
Denn das ist C++/CLI Code. Den kannst Du in C# nutzen, OHNE nochmals den Delegaten zu deklarieren. (Diesen Typen gibts ja eben schon.)
public delegate void delDllResultHandler(tResultFlag ResultFlag, tExtendedResultFlag ExtendedResultFlag, tResultListEntry ^rResultListEntry);
Also einfach in C#, wie Du bereits geschrieben hast:
Read.OnDllResultHandler += new DllDotNet.delDllResultHandlerSyncGetEPCs(DllResultHandler);
Simon
-
ich möchte dieses Delegate in C# nutzen
-
Habe ich mir gedacht. Siehe mein vorheriger Post.
Simon
-
un wieso dann die Fehler?
-
Weil Du, so habe ich Dich verstanden, in C# den Delegaten nochmals definierst (darfst Du nicht) und Du dabei im C# Code C++/CLI Syntax verwendet hast (^ gibts nur in C++/CLI).
-
sorry das war ein Fehler so definiere ich die Funktion die ich dem Delegate übergeben in C#.
Und an dem ^ meckert er
public void DllResultHandler(DllDotNet.tResultFlag ResultFlag, DllDotNet.tExtendedResultFlag ExtendedResultFlag,DllDotNet.tResultListEntry ^rResultListEntry) {
-
Ja, eben, ^ gibts nicht in C#.
Schau mal, ein Bsp:
List<String^>^ list = gcnew List<String^>();
ist dasselbe wie...
List<String> list = new List<String>();
-
Ändert nichts an dem was theta gesagt hat. ^ wird so in C# nicht
eingesetzt, das ist reine C++/CLI SyntaxEdit: zu lahm...
-
wenn ich in der CLI C++ DLL das Delegate mit ^definiere und in den c# dann die funktion ohne ^ dann meckert er das die typen nicht übereinstimmen wenn ich das delegate erzeuge
Fehler CS0123: Keine Überladung für "DllResultHandler" stimmt mit dem Delegaten "DllDotNet.tKSRWdelDllResultHandler" überein.
wie verhindere ich das?
MfG
-
Wie sieht die Methode DllResultHandler von folgendem Code aus?
Read.OnDllResultHandler += new DllDotNet.delDllResultHandlerSyncGetEPCs(DllResultHandler);
Diese Methode MUSS der im Delegaten definierte Signatur entsprechen.
Simon
-
public delegate void tdelDllResultHandler(tResultFlag ResultFlag, tExtendedResultFlag ExtendedResultFlag, tResultListEntry ^rReultListEntry);
public void DllResultHandler(DllDotNet.tResultFlag ResultFlag, DllDotNet.tExtendedResultFlag ExtendedResultFlag,DllDotNet.tResultListEntry rResultListEntry)
oder
public void DllResultHandler(DllDotNet.tResultFlag ResultFlag, DllDotNet.tExtendedResultFlag ExtendedResultFlag,DllDotNet.tResultListEntry ^rResultListEntry)
beide führen zu Fehlern
-
Korrekt ist:
public void DllResultHandler(DllDotNet.tResultFlag ResultFlag, DllDotNet.tExtendedResultFlag ExtendedResultFlag,DllDotNet.tResultListEntry rResultListEntry
Was kommen für Fehler?
Das andere ist ja eben gar kein C# Code.
-
Fehler CS0123: Keine Überladung für "DllResultHandler" stimmt mit dem Delegaten "DllDotNet.delDllResultHandler" überein.
-
Dann wird wohl das Mapping eines Typen anders sein als angegeben.
Wie sind in C++/CLI die Parameter Typen des Delegaten definiert?
Simon
-
public value struct tResultListEntry { unsigned long udwTimeStamp; unsigned short uwReadCount; unsigned char ubCountWords; array<unsigned short> ^puwData; };
-
Aber das ist ja nur einer... die andern?
-
Mit dem ValueType (value struct) gehts nicht, weil der ValueType geboxt wird und es eine "komische" Signatur ergibt.
Du kannst ganz einfach aus dem value struct ein ref struct machen.
(Die Semantik ändert von Value auf Reference!).Simon
-
was ist den der unterschied zwischen dem value und ref?
-
Das findest Du bestimmt selbst mit ein wenig Googeln raus...
Ausserdem habe ich schon eine Erklärung abgegeben.
Simon
-
mit ref geht es
ich habe mal diese Seite gefunden http://www.codeproject.com/KB/cs/Types.aspx
danach besteht der einzige unterschied zwischen ref und value, dass wenn man
a=b;
macht bei ref die Referenz kopiert wird und bei value der Kopierkonstruktor gerufen wird.
Ist das korrekt?