我有以下結構中聲明(C++):整個C++/C#邊界管理非託管字符串的P/Invoke
struct NativeOperationResult {
const INTEROP_BOOL Success; // INTEROP_BOOL = char
const char16_t* const ErrorMessage;
NativeOperationResult(const NativeOperationResult& c);
/* various constructors, omitted for brevity */
};
現在,我有一個導出函數的定義在別處:
extern "C" __declspec(dllexport) NativeOperationResult ReturnFailureWithMessage() {
return { INTEROP_BOOL_FALSE, "Test" };
}
我預計將通過P/Invoke從C#中調用ReturnFailureWithMessage
(如果您想知道該測試方法)。在構造函數NativeOperationResult
中,它需要「Test」的一個副本並將其放入ErrorMessage
。
NativeOperationResult擁有char16_t*
的所有權,所以我需要在結構被銷燬時將其刪除。這沒有問題,但我不想在.NET CLR有機會將字符串複製到託管堆之前刪除內存。
坦率地說,我對刪除內存的位置有些模糊。我認爲C++編譯器會複製我的結構(或者只是移動它),然後CLR將使用該副本......這意味着我應該使用Marshal.FreeHGlobal
從.NET中刪除本機內存。
這是正確的嗎?
喜漢斯,感謝您的評論。我在C#端使用ICustomMarshaler作爲字符串。而且我已經用U1類型對bool進行了註釋。 – Xenoprimate 2014-10-10 14:42:14