我想导入一个未管理的C++ DLL并调用一个需要stringstream
作为参数的函数。在C#中,没有stringstream
类,所以有人能告诉我如何从C#程序调用这样的函数吗?
我想导入一个未管理的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++代码绑定到C#中的托管代码。一般而言,最好的方法是在托管的C++中引入中间层,它将为来自C#的调用提供接口。
BOOL getString(TCHAR * myreturnString, DWORD *size);
std::string
是std::basic_string<char, std::allocator>
的一个typedef
,也就是说,它和stringstream
一样都是模板化的。 - Max Lybbertbasic_string
系列。请参见http://support.microsoft.com/kb/168958。 - KitsuneYMG