std::string marshallen geht nicht wenn Remote-Obj



  • Hallo in die Gemeinde,

    unter VS2005/WinXP/Framework 3.0 habe ich ein verwirrendes Problem: ich habe eine C++/CLI Wrapper Klasse, die mir eine native C++ DLL wrappt.

    Ich referenzierte von einer C# Applikation diesen Wrapper, mache meine Aufrufe und alles funktioniert wie gewollt. Im Besonderen werden bei den Aufrufen nach native C++ std::string's übergeben (per Stack, d.h. keine Refezenzen, also z.B. long lres = pNativeObj->DoWhat( x, y, "hallo" ); ) - soweit kein Problem.

    Nun muss ich diesen C++/CLI Wrapper aber auch in einem Remoting Objekt verwenden. Das Remoting selbst funktioniert, eine minimale C#-Applikation bildet den Host, zunächst noch als "localhost" auf dem selben PC etc.) und meine Aufrufe vom Client kommen auch im Remoting-Object an. Im Remoting Object kommt nun irgendwann der Aufruf in die native C++ DLL (long lres = pNativeObj->DoWhat( x, y, "hallo" ); also genau wie oben, gleiche Wrapper-Assembly!) und nun passiert es: der std:string, hier also "hallo" ist auf nativer C++ Seite kryptisch und riesig lang! Basis Variable double, int, scheinen dagegen zu funktionieren.

    Im einen Fall funktioniert also das Marshalling, im anderen Fall aber nicht. Was ist anders, irgendein Encoding oder macht es einen Unterschied, weil der Wrapper im einen Fall mit new, im anderen mit Activator.GetObject(...) in einer Remoting Umgebung erzeugt wurde?

    Also wenn ich nicht schon Stunden gegoogelt und experimentiert hätte.... also ich bin sehr ratlos. Vielleicht hat hier jemand eine hilfreiche Idee?

    Danke und Gruss, Holger.



  • Selbstheilung durch Handauflegen? Heute morgen Neustart des Rechners und auf einmal funktioniert alles ohne jegliche Änderung zu meinem gestrigen, fehlerhaften Stand. Ich habe dieses Problem garantiert NICHT geträumt im Gegenteil: mehrere Stunden debuggt und der Fehler war immer reproduzierbar.
    Ich denke wirklich, in bin einem Bug auf den Leim gegangen und werde heute mal das SP1 fürs Studio drauf hauen sowie auf das aktuellste Framework upgraden...

    Was bleibt, ist ein bitterer Nachgeschmack.... wird es morgen auch noch tun?



  • Ich habe den Text kurz überflogen und folgende Anmerkung:

    Marshalling bei Strings ist meines Wissens nur mit C-Strings (char []) möglich und nicht mit std::string.
    Versuche, einen Umweg über die alten C-Strings zu gehen.



  • Hi,
    und danke für die Info. Du meinst also den CString (Microsoft)-Typen? Dagegen spricht, DASS es ja nun funktioniert aber es wäre kein grosses Problem, auf CString umzustellen wenn ich sicher gehen will...
    ByTheWay: ich habe nicht so viel Erfahrung mit Marshalling aber bei C# gesehen, dass es so Attribute [MarshalAs] usw. gibt, gilt das so auch für C++/CLI?
    Gruss,
    Holger


Anmelden zum Antworten