从C+编组复杂结构+;到C# 几天来,我一直试图把一个复杂的结构从C++到C语言,基本上我已经设法得到了我所要完成的大部分工作,但是现在我却被困在试图整理我认为是一个列表的事情中。

从C+编组复杂结构+;到C# 几天来,我一直试图把一个复杂的结构从C++到C语言,基本上我已经设法得到了我所要完成的大部分工作,但是现在我却被困在试图整理我认为是一个列表的事情中。,c#,c++,struct,pinvoke,C#,C++,Struct,Pinvoke,在这个例子中,我将包括我所做的工作和我的困境 public: void __thiscall TransactionModule_t::GetTransaction(class Identity_t const &)const 确认如下: // public: void __thiscall TransactionModule_t::GetTransaction(class Identity_t const &)const [DllImport("Transacti

在这个例子中,我将包括我所做的工作和我的困境

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 
甚至可以调用这个方法吗,我是否遗漏了什么

甚至可以调用这个方法吗

不,不是。不能从C#code提供
std::vector


实际上,您需要一个C++/CLI包装器

当双方都能理解来回传递的数据的结构和访问机制时,编组就起作用了。C不理解向量的结构和存取机制,这是我害怕的,是我开始学习C++的时候,试着去掌握正在发生的事情。从我所读到的,向量是一个未定义的数组,它可以在大小上改变,分配器是一个预先定义的大小数组。重点是互操作需要二进制兼容性,而对于C++类这样的复杂类型来说,这是不可能的。C++/CLI使生活变得简单。
// 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;
}