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% 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?
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.
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.
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.
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.
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%Tags und Links c# c++ dll visual-c++