Referenzen in Delegates **gelöst**
-
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?
-
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.
Das ist nicht der einzige Unterschied.