2011-07-23 6 views
1

構造体を管理対象コードから管理対象コードにipcで転送します。 固定サイズを設定しないで文字列を転送することは可能です または残りの部分を構造体の最後のメンバーに埋め込みますか?Interop C++ struct in c#可変長文字列サイズ

C++のstruct

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

変換は

を構造体へのバイト
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を渡した場合、 オブジェクトが異なる可能性があります。

+0

私はあなたのことを分かります。 charポインタを使用することによって、いくつかのポインタを転送するかどうかを指定できますか?私の質問は可能ですか?私はC#.NET Worldからのもので、C++を扱うのは難しいです。 –

+0

C++コード自体で変換を行う必要があります。 1つ以上のソースファイルに対してCLIを有効にすることができます。しかし、C++プロジェクトはMSCOREE.DLLに依存していました(ネイティブクライアントはそれをロードすることができます)。 – Ajay

+0

私の場合はCLIを有効にすることはできません。 –

-1

この他の投稿はあなたに役立つかもしれません。

using StringBuilder insteadが含まれます。

ソケットは通常固定長バッファを使用するので、可変バッファ長が必要なのはなぜですか?

+0

私の問題はC++側にあると思います... StringBuilderは私を助けません。ソケット構造体は単なる例です。私はwinsock recvからいくつかの迂回されたデータを転送する必要があります。 –