C++/MFCのプログラムからC#/WPFのプログラムにドラッグアンドドロップでデータを渡すにはどうするのがよいでしょうか。現在以下のようなコードで、C#側でDragEventArgsにデータが入っているのまで確認できたのですがうまく取り出せません。C++側は既存コードなのでC#側で対応したいです。値を変換するためだけのDLLをC++/CLIで作るとよいのでしょうか?

C++のコード

typedef struct {
    bool isBar;
    int val;
    WCHAR name[100];
} Bar;

typedef struct {
    int val;
    TCHAR name[100];
    Bar bar[1];
} Foo;

void StartDrag(Foo foo) {
    STGMEDIUM   data;
    data.tymed = TYMED_HGLOBAL;
    data.hGlobal = (HGLOBAL)foo;
    data.pUnkForRelease = NULL;

    CLIPFORMAT f;
    f = RegisterClipboardFormat(TEXT("FOO"));

    COleDataSource *DataSource = new COleDataSource();
    DataSource->CacheData(f, &data);
    DataSource->DoDragDrop(DROPEFFECT_COPY|DROPEFFECT_MOVE);
}

C#のコード

[StructLayout(LayoutKind.Sequential)]
public struct Bar
{
    [MarshalAs(UnmanagedType.Bool)]
    public bool IsText;
    public int value;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
    public string name;
}

[StructLayout(LayoutKind.Sequential)]
public struct Foo
{
    public int value;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
    public string name;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
    public Bar[] bar;
}

void OnDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent("FOO"))
    {
        var fooStream = e.Data.GetData("FOO");
        // fooStreamはMemoryStream、BinaryReaderで見ると
        // C++側で設定した値が入っているのが見える

        var foo = e.Data.GetData(typeof(Foo)); // fooはnull
    }
}