如何调用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);