2011-07-23 76 views
1

我通過ipc從非託管轉換爲託管代碼的結構。 是否可以傳輸字符串而不設置常量大小 或將其餘字節填充到結構的最後一個成員中?互操作C++結構在C#變量字符串大小

C++結構

typedef union 
{ 
    struct 
    { 
     int id; 
     string Data; 
    }; 
    char bytes[]; 
} SocketData; 

C#結構

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
    public struct SocketData 
    { 
     public int id; 
     public string Data; 
    } 

轉換字節STRUCT

public static object RawDeserialize(byte[] rawData, int position, Type anyType) 
{ 
    var rawsize = rawData.Length; 
    //if (rawsize > rawData.Length) 
    // return null; 
    var buffer = Marshal.AllocHGlobal(rawsize); 
    Marshal.Copy(rawData, position, buffer, rawsize); 
    var retobj = Marshal.PtrToStructure(buffer, anyType); 
    Marshal.FreeHGlobal(buffer); 
    return retobj; 
} 

回答

1

不這樣做,std::string不是POD。 即使使用不同的編譯器/鏈接器版本std::string也不是二進制兼容*,您不能指望它在託管和非託管世界之間兼容。如果你有一個使用XX編譯器版本(甚至是同一個供應商)的DLL版本,並且從客戶端(EXE)傳遞std::string,而客戶端是使用較舊/較新的編譯器/頭版本構建的 - string對象可能不一樣。

+0

我明白你的觀點。通過使用字符指針只會傳遞一些指針或不是?我的問題甚至有可能嗎?我來自C#.NET World並且很難處理C++。 –

+0

您需要在C++代碼本身進行轉換。您可以爲一個或多個源文件啓用CLI。然而,C++項目依賴於MSCOREE.DLL(本地客戶端可以加載它)。 – Ajay

+0

我知道但我不能啓用CLI在我的情況。 –

-1

This other posts may help you。其中涉及using StringBuilder instead

我想知道爲什麼你需要可變緩衝區長度,因爲套接字通常使用固定長度的緩衝區

+0

我認爲我的問題是在C++端... StringBuilder不幫助我。套接字結構只是一個例子。我需要從winsock recv轉移一些繞道數據。 –