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