2015-07-24 1 views
2

Depuis quelques jours, j'ai essayé de Marshal une structure complexe de C++ à C#, fondamentalement, j'ai réussi à obtenir la plupart de ce que j'essaie de réaliser mais maintenant je suis coincé essayer de rassembler ce que je crois est une liste.Structure de complexe de C++ à C#

Dans l'exemple, je vais inclure ce que je fais travailler et où je suis coincé.

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

comme follwoing Conformi:

// public: void __thiscall TransactionModule_t::GetTransaction(class Identity_t const &)const  
[DllImport("Transaction.dll", EntryPoint = "[email protected][email protected]@[email protected]@@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; 
    } 
} 

Cela fonctionne très bien.

Cependant, je veux appeler une méthode qui me donne la liste.

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

Et où je suis rester coincé:

// 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); 

J'ai essayé de faire une classe qui correspond entre les deux. Est-il même possible d'appeler cette méthode? Ai-je oublié quelque chose ici?

+0

La numérisation fonctionne lorsque les deux parties peuvent comprendre la structure et le mécanisme d'accès des données qui sont transmises d'avant en arrière. C# ne comprendra pas la structure et le mécanisme d'accès des vecteurs. – sameerkn

Répondre

0

Est-il même possible d'appeler cette méthode?

Non, ce n'est pas le cas. Vous ne pouvez pas fournir un std::vector à partir du code C#. En pratique, vous aurez besoin d'un wrapper C++/CLI.

+0

C'était ce dont j'avais peur, il était temps pour moi de commencer à étudier le C++ et d'essayer de comprendre ce qui se passe. Dans la mesure où d'après ce que j'ai lu, un vecteur est un tableau indéfini dont la taille peut changer et l'allocateur est un tableau de taille prédéfinie. – Joachim

+0

Le fait est que l'interopérabilité nécessite une compatibilité binaire, ce qui n'est pas possible pour les types complexes comme les classes C++. C++/CLI rend la vie facile. –

+0

Je me demande ce que vous cherchez ici –