use*_*246 8 c# c++ dll visual-c++
我想导入一个非托管C++ DLL并调用一个stringstream作为参数的函数.在C#中,没有stringstream类,所以有人能告诉我如何从C#程序调用这样的函数吗?
ten*_*our 11
您不应该通过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++ 互操作真的很糟糕。