2015-09-09 69 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 
    }