将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个字符,我真的不喜欢每次复制两次的想法。

c#

public static void MyMethod(StringBuilder buffer)
{
    //...
}

c++/CLI

extern "C" __declspec(dllexport)
void __stdcall MyFunction(char* buffer, int length)
{
    MyNamespace::MyClass::MyMethod( /* ? */ );
}

将char* buffer作为StringBuilder传递给c#

  1. 使用byte [], c++ 8位字符数组将正确对齐。

  2. 我更喜欢做类似的事情,因为我将它用于非托管代码:

    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
    }