编组从C ++到C#的复杂结构

时间:2015-07-24 00:10:37

标签: c# c++ struct pinvoke

几天以来,我一直试图将一个复杂的结构从C ++元素化为C#,基本上我已经设法完成了我想要完成的大部分工作,但现在我不得不试图整理我认为的是一个清单。

在示例中,我将包括我的工作以及我被困在哪里。

public: void __thiscall TransactionModule_t::GetTransaction(class Identity_t const &)const 

符合以下条件:

// public: void __thiscall TransactionModule_t::GetTransaction(class Identity_t const &)const     
[DllImport("Transaction.dll", EntryPoint = "?GetTransaction@TransactionModule_t@@Identity_t@@@Z", CallingConvention = CallingConvention.ThisCall)]
public static extern void GetTransaction(IntPtr iPtr,[Out, MarshalAs(UnmanagedType.LPStruct)] Identity transaction);


[StructLayout(LayoutKind.Sequential)]
[Serializable]
public class Identity
{
    public uint Id;
    public uint Type;

    public Identity(uint id = 0, uint type = 0)
    {
        this.Id = id;
        this.Type = type;
    }
}

这很好用。

但是我想调用一个给我列表的方法。

public: void __thiscall TransactionModule_t::GetTransactions(class std::vector<class Identity_t,class std::allocator<class Identity_t> > &)const 

我陷入困境的地方:

// public: void __thiscall TransactionModule_t::GetTransactions(class std::vector<class Identity_t,class std::allocator<class Identity_t> > &)const 
[DllImport("Transaction.dll", EntryPoint = "long mangled entry point", CallingConvention = CallingConvention.ThisCall)]
public static extern void GetTransactions(IntPtr iPtr,[Out] Transactions transactions);

我尝试创建一个适合两者之间的课程。

[StructLayout(LayoutKind.Sequential)]
[Serializable]
public class Transactions
{
    public Identity Identity;
    public Identity[] List;
}

甚至可以调用此方法,我在这里遗漏了什么吗?

1 个答案:

答案 0 :(得分:0)

  

甚至可以调用此方法吗?

不,不是。您无法从C#代码提供std::vector

实际上你需要一个C ++ / CLI包装器。