如何调用C#DLL的函数来接受来自C#的stringstream类型的参数?

我想导入一个非托管C ++ DLL并调用一个将stringstream作为参数的函数。 在C#中,没有stringstream类,所以有人能告诉我如何从C#程序调用这样的函数吗?

您不应该通过DLL,句点暴露模板化对象。

模板化对象(例如std::几乎所有内容)都会内联。 因此,通过这种方式,您的DLL将获得自己的实现私有副本。 调用DLL的模块也将获得自己的stringstream私有实现。 在它们之间传递意味着你无意中将两个不相关的实现编织在一起。 对于许多项目,如果您使用完全相同的构建设置,则可能没有问题。

但即使你使用相同的编译器,并将发布DLL与调试EXE混合,你会发现堆栈/堆损坏和其他难以发现的问题。

而这只是使用来自另一个非托管C ++ exe / dll的DLL。 然后跨越到.NET的线路更是一个问题。

解决方案是将DLL的界面更改为在DLL边界内友好的界面。 COM(你可以使用IStream ),或者只是像winapi这样的C风格的界面。

如果可以修改C ​​++ dll,则导出纯字符串版本。 否则,您必须构建托管C ++包装器项目,导入其他C ++ dll,将其导出为托管函数,然后从C#代码中调用它。 C ++互操作真的很糟糕。

我担心你将不得不在C#中创建自己的StringStream类,以便能够使用从该DLL导出的函数。 如您所述,.NET Framework不提供任何类似的开箱即用类。

最简单的方法可能是包装.NET Framework提供的StringBuilder类,使其可以作为流运行。 有关进一步说明和一些示例代码,请参阅此博客文章 。

MSDN杂志也回答了类似的问题: http : //msdn.microsoft.com/en-us/magazine/cc163768.aspx 。 您可能会发现一些有用的提示和/或示例代码。

您正在尝试将本机C ++代码绑定到C#中的托管代码。 一般来说,最好的方法是在托管C ++中引入中间层,它将为来自C#的调用提供接口。

在c或c ++中创建一个Wrapper dll,公开对该函数的友好调用。 这是更好的方式。

例如

 BOOL getString(TCHAR * myreturnString, DWORD *size);