2015-09-09 56 views
1

我有一个C++函数,用一个char *缓冲区调用以用于输出。现在我想用C#写信给它,所以我需要从C++函数调用托管方法。我无法弄清楚的是如何将它作为StringBuilder传递。将char *缓冲区作为StringBuilder传递给C#

我以前使用Robert Giesecke's 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(/* ? */); 
} 
+7

你必须将它复制* *无论如何,因为.NET串由16 bit宽字符,你的函数使用8位'char'。你*有*在某些时刻将其转换为8位。 –

回答

0
  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 
    }