Вы не должны выставлять шаблонные объекты через DLL, точка.
Шаблонные объекты (например, почти все в std::
) становятся встроенными. Таким образом, ваша DLL получает свою собственную копию реализации. Модуль, вызывающий вашу DLL, также получит свою собственную реализацию stringstream
. Переход между ними означает, что вы случайно сплетаете две несвязанные реализации. Для многих проектов, если вы используете одни и те же настройки сборки, это, вероятно, не проблема.
Но даже если вы используете один и тот же компилятор и смешаете DLL-версию выпуска с отладочным EXE-файлом, вы обнаружите повреждение стека / кучи и другие проблемы, которые трудно найти.
И это только использование вашей DLL из другого неуправляемого exe / dll C ++. Пересечение строк с .NET - еще большая проблема.
Решение состоит в том, чтобы изменить интерфейс вашей DLL на что-то, что будет играть дружелюбно через границы DLL. Либо COM (например, вы можете использовать IStream
), либо просто интерфейс в стиле C, например, winapi.