如何调用C++;从C#接受stringstream类型参数的DLL? 我想导入一个非托管C++ DLL,并调用一个函数,它以 StrugStult作为参数。在C语言中,没有 String Strue类,所以有人能告诉我如何从C++程序调用这个函数吗?< /p> < p>如果你可以修改C++ DLL,输出一个普通的字符串版本。否则,必须建立托管的C++包装器项目,导入其他C++ DLL,将其作为托管函数导出,并从C代码中调用该函数。C++互操作非常糟糕。 < P>恐怕你必须在C语言中创建你自己的 StrugStule类,以便能够消耗从DLL导出的函数。正如您所提到的,.NET Framework没有提供任何类似的现成类

如何调用C++;从C#接受stringstream类型参数的DLL? 我想导入一个非托管C++ DLL,并调用一个函数,它以 StrugStult作为参数。在C语言中,没有 String Strue类,所以有人能告诉我如何从C++程序调用这个函数吗?< /p> < p>如果你可以修改C++ DLL,输出一个普通的字符串版本。否则,必须建立托管的C++包装器项目,导入其他C++ DLL,将其作为托管函数导出,并从C代码中调用该函数。C++互操作非常糟糕。 < P>恐怕你必须在C语言中创建你自己的 StrugStule类,以便能够消耗从DLL导出的函数。正如您所提到的,.NET Framework没有提供任何类似的现成类,c#,c++,visual-c++,dll,C#,C++,Visual C++,Dll,最简单的方法可能是包装.NET Framework提供的StringBuilder类,使其可以作为流运行。有关详细说明和一些示例代码,请参阅 MSDN杂志也回答了类似的问题:。您可能会发现其中给出的一些提示和/或示例代码很有用。您不应该通过DLL、句点公开模板对象 模板化对象(例如std::中的几乎所有内容)成为内联对象。因此,通过这种方式,您的DLL将获得它自己的实现的私有副本。调用DLL的模块还将获得自己的私有实现stringstream。在它们之间传递意味着您无意中将两个不相关的实现编织在

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


MSDN杂志也回答了类似的问题:。您可能会发现其中给出的一些提示和/或示例代码很有用。

您不应该通过DLL、句点公开模板对象

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

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

<>这只是从另一个非托管C++ exe/dll中使用DLL。跨越与.NET的界限更是一个问题


解决方案是将DLL的接口更改为跨DLL边界友好的接口。或者COM(例如,可以使用<代码> ISTRAM< <代码>),或者只是一个C风格的接口,比如WiAPI。

< p>您试图在C++中将本机C++代码绑定到托管代码。最好的做法是在托管C++中引入中间层,它将提供C++调用的接口。

在C或C++中创建一个包装DLL,它向该函数公开友好调用。这是更好的方法

例如

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

我试图导入一个非托管C++中的函数,它将STD:String作为参数进入C语言程序,并得到以下运行时错误:“未处理的异常:Stry.Access BurimeExchange:试图读取或写入受保护的内存。这通常是其他内存损坏的指示。(字符串和输入字符串、字符串和输出字符串)位于Win32API.Main()<代码> > STD::String 是<代码> TyPuff <代码> STD::Basic字符串S/<代码>,即它被称为“代码> String Strue。还有各种智能指针?如果我照字面意思,这意味着不应该在DLL边界上暴露非平凡C++。OME。有出口C++对象的方法没有问题,因为实现有一个家。模板化(或任何内联)实现有许多独立的实现,不混合。包括智能指针。但它们指向的对象不一定是。我很确定VS define _USER _DLL会自动导出
基本字符串
系列。请参阅。