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

时间:2010-12-27 12:14:46

标签: c# c++ visual-c++ dll

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

5 个答案:

答案 0 :(得分:11)

您不应通过DLL,句点公开模板化对象。

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

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

这只是使用来自另一个非托管C ++ exe / dll的DLL。然后将这些行交叉到.NET更是一个问题。

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

最简单的方法可能是包装.NET Framework提供的StringBuilder类,使其可以作为流运行。有关详细说明和一些示例代码,请参阅this blog post

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

例如

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