How can I call a function of a C++ DLL that accepts a parameter of type stringstream from C#?

You should not expose templated objects via a DLL, period.

Templated objects (e.g. almost everything in std::) become inlined. So in this way, your DLL gets its own private copy of the implementation. The module calling your DLL will also get its own private implementation of stringstream. Passing between them means you are inadvertently weaving two unrelated implementations together. For many projects, if you are using the exact same build settings, it’s probably no problem.

But even if you use the same compiler, and mix a release DLL with a debug EXE, you will find stack / heap corruption and other harder-to-find problems.

And that’s only using your DLL from another unmanaged C++ exe/dll. Crossing then the lines to .NET is even more of a problem.

The solution is to change your DLL’s interface to something that plays friendly across DLL bounds. Either COM (you could use IStream for example), or just a C-style interface like the winapi.

Leave a Comment