Как я могу вызвать функцию C ++ DLL, которая принимает параметр типа stringstream из C #? - PullRequest
8 голосов
/ 27 декабря 2010

Я хочу импортировать неуправляемую C ++ DLL и вызвать функцию, которая принимает stringstream в качестве параметра. В C # нет класса stringstream, поэтому кто-нибудь может сказать мне, как вызвать такую ​​функцию из программы на C #?

Ответы [ 5 ]

11 голосов
/ 29 декабря 2010

Вы не должны выставлять шаблонные объекты через DLL, точка.

Шаблонные объекты (например, почти все в std::) становятся встроенными. Таким образом, ваша DLL получает свою собственную копию реализации. Модуль, вызывающий вашу DLL, также получит свою собственную реализацию stringstream. Переход между ними означает, что вы случайно сплетаете две несвязанные реализации. Для многих проектов, если вы используете одни и те же настройки сборки, это, вероятно, не проблема.

Но даже если вы используете один и тот же компилятор и смешаете DLL-версию выпуска с отладочным EXE-файлом, вы обнаружите повреждение стека / кучи и другие проблемы, которые трудно найти.

И это только использование вашей DLL из другого неуправляемого exe / dll C ++. Пересечение строк с .NET - еще большая проблема.

Решение состоит в том, чтобы изменить интерфейс вашей DLL на что-то, что будет играть дружелюбно через границы DLL. Либо COM (например, вы можете использовать IStream), либо просто интерфейс в стиле C, например, winapi.

3 голосов
/ 27 декабря 2010

Боюсь, вам придется создать свой собственный класс StringStream в C #, чтобы можно было использовать функции, экспортированные из этой DLL. Как вы упомянули, .NET Framework не предоставляет аналогичного класса из коробки.

Самый простой способ - это обернуть класс StringBuilder, предоставляемый .NET Framework, чтобы он мог функционировать как поток. См. это сообщение в блоге для дальнейшего объяснения и некоторого примера кода.

На аналогичный вопрос также был дан ответ в журнале MSDN: http://msdn.microsoft.com/en-us/magazine/cc163768.aspx. Вы можете найти некоторые подсказки и / или примеры кода, приведенные там, полезными.

3 голосов
/ 27 декабря 2010

Если вы можете изменить DLL C ++, экспортируйте версию в виде простой строки.В противном случае вам необходимо создать управляемый проект-оболочку C ++, импортировать другую DLL C ++, экспортировать ее как управляемую функцию и вызвать ее из своего кода C #.Взаимодействие C ++ действительно отстой.

0 голосов
/ 24 января 2011

Создайте DLL-оболочку в c или c ++, которая предоставляет дружественный вызов этой функции. Это лучший способ.

например

BOOL getString(TCHAR * myreturnString, DWORD *size);
0 голосов
/ 22 января 2011

Вы пытаетесь привязать собственный код C ++ к управляемому коду в C #.В общем, лучший способ сделать это - ввести промежуточный уровень в управляемом C ++, который предоставит интерфейс для вызовов из C #.

...