我想导入一个非托管C ++ DLL并调用一个以stringstream
为参数的函数。在C#中,没有stringstream
类,所以有人能告诉我如何从C#程序调用这样的函数吗?
答案 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);