将char* buffer作为StringBuilder传递给c#
本文关键字:StringBuilder 作为 char buffer | 更新日期: 2023-09-27 18:12:04
我有一个c++函数,它被调用时带有一个char*缓冲区用于输出。现在我想用c#写它,所以我需要从c++函数调用一个托管方法。我不能弄清楚的是如何将它作为StringBuilder传递。
我以前使用Robert Giesecke的Unmanaged Exports,它工作得很好,并且使用默认的字符串编组方案自动完成了这一点,但我想使用StringBuilder的MaxCapacity的size参数。
有一个更好的方法来做到这一点比创建一个新的StringBuilder实例,写到它,得到一个CLR字符串与ToString()
,然后复制内容到缓冲区?所讨论的字符串可能长达10,000个字符,我真的不喜欢每次复制两次的想法。
public static void MyMethod(StringBuilder buffer)
{
//...
}
c++/CLI
extern "C" __declspec(dllexport)
void __stdcall MyFunction(char* buffer, int length)
{
MyNamespace::MyClass::MyMethod( /* ? */ );
}
-
使用
byte []
, c++ 8位字符数组将正确对齐。 -
我更喜欢做类似的事情,因为我将它用于非托管代码:
String ^ ToManagedString(const char * pString) { return Marshal::PtrToStringAnsi(IntPtr((char *)pString)); // Marshal pString into Managed Memory. return as a C# string reference (^). } const std::string ToStdString(String ^ strString) { IntPtr ptrString = IntPtr::Zero; std::string strStdString; try { ptrString = Marshal::StringToHGlobalAnsi(strString); // Marshal a C# String reference into unmanaged HEAP memory space. strStdString = (char *)ptrString.ToPointer(); // Convert C# IntPtr to char* implicitly, call assignment operator of std::string to copy. } finally { if (ptrString != IntPtr::Zero) { Marshal::FreeHGlobal(ptrString); } } return strStdString; // return std::string copied out of interop unmanaged heap space }