Wie kann ich eine Funktion einer C ++ DLL aufrufen, die einen Parameter vom Typ stringstream von C # akzeptiert?

8

Ich möchte eine nicht verwaltete C ++ - DLL importieren und eine Funktion aufrufen, die stringstream als Parameter akzeptiert. In C # gibt es keine stringstream -Klasse, also kann mir jemand sagen, wie man eine solche Funktion von einem C # -Programm anruft?

    
user186246 27.12.2010, 12:14
quelle

5 Antworten

11

Sie sollten Vorlagenobjekte nicht über eine DLL freigeben, Punkt.

Vorlagenobjekte (z. B. fast alles in std:: ) werden inline. Auf diese Weise erhält Ihre DLL eine eigene Kopie der Implementierung. Das Modul, das Ihre DLL aufruft, erhält auch eine eigene private Implementierung von stringstream . Wenn Sie zwischen ihnen hin- und herwechseln, werden Sie unabsichtlich zwei unabhängige Implementierungen miteinander verweben. Für viele Projekte ist es wahrscheinlich kein Problem, wenn Sie die gleichen Build-Einstellungen verwenden.

Aber selbst wenn Sie denselben Compiler verwenden und eine Release-DLL mit einer Debug-EXE mischen, finden Sie Stapel / Heap-Fehler und andere schwer zu findende Probleme.

Und das verwendet nur Ihre DLL von einer anderen nicht verwalteten C ++ exe / dll. Crossing dann die Zeilen zu .NET ist noch ein Problem.

Die Lösung besteht darin, die Benutzeroberfläche Ihrer DLL in etwas zu ändern, das über DLL-Grenzen hinweg freundlich abgespielt wird. Entweder COM (Sie könnten zum Beispiel IStream verwenden), oder nur eine C-Style-Schnittstelle wie die Winapi.

    
tenfour 29.12.2010 05:53
quelle
3

Wenn Sie die C ++ - DLL ändern können, exportieren Sie eine einfache String-Version. Andernfalls müssen Sie ein verwaltetes C ++ - Wrapper-Projekt erstellen, die andere C ++ - DLL importieren, als verwaltete Funktion exportieren und aus Ihrem C # -Code aufrufen. C ++ - Interop wirklich saugt.

    
fejesjoco 27.12.2010 12:16
quelle
3

Ich befürchte, dass Sie Ihre eigene StringStream -Klasse in C # erstellen müssen, um die von dieser DLL exportierten Funktionen nutzen zu können. Wie Sie bereits erwähnt haben, stellt .NET Framework keine ähnliche Klasse bereit.

Der einfachste Weg besteht wahrscheinlich darin, die von .NET Framework bereitgestellte Klasse StringBuilder so zu umbrechen, dass sie als Stream fungieren kann. In diesem Blogpost finden Sie weitere Erläuterungen und einen Beispielcode.

Eine ähnliche Frage wurde auch im MSDN Magazine beantwortet: Ссылка . Möglicherweise finden Sie einige der Hinweise und / oder Beispielcode dort nützlich.

    
Cody Gray 27.12.2010 12:34
quelle
0

Sie versuchen, nativen C ++ - Code an verwalteten Code in C # zu binden. Der beste Weg, dies im Allgemeinen zu tun, besteht darin, eine mittlere Schicht in verwaltetem C ++ einzuführen, die eine Schnittstelle zu Aufrufen von C # bereitstellt.

    
Alexei Polkhanov 22.01.2011 19:35
quelle
0

Erstellen Sie eine Wrapper-DLL in c oder c ++, die einen benutzerfreundlichen Aufruf für diese Funktion bereitstellt. Es ist der bessere Weg.

zum Beispiel ein

%Vor%     
Sorcerer86pt 24.01.2011 13:09
quelle

Tags und Links