2010-10-28 14 views
0

J'appelle une fonction C++ de C#. En tant qu'arguments, il reçoit un pointeur vers un tableau de structures.Marquer un tableau de structures

struct A 
{ 
    int data; 
} 

int CFunction (A* pointerToFirstElementOfArray, int NumberOfArrayElements) 

En C# J'ai créé le même struct (en classe) et je Marshall correctement (le premier élément du tableau est reçu correctement). Voici mon C# définition du struct C++:

[StructLayout(LayoutKind.Sequential), Serializable] 
class A 
{ 
    int data; 
} 

Le premier élément est lu correctement, donc je connais tous les champs de la struct sont rassemblèrent correctement. Le problème se produit lorsque j'essaie d'envoyer un tableau d'éléments. Comment créer un tableau de classes qui seront dans un seul bloc de mémoire (morceau), de sorte que la fonction C++ peut incrémenter le pointeur sur le tableau?

Je suppose que j'aurais besoin de quelque chose de similaire à stackalloc, mais je crois que cela ne fonctionne que pour les types primitifs?

Nous vous remercions de votre aide.

+0

Connaissez-vous la taille de la baie que vous envoyez au moment de la compilation? –

+0

@ohadsc Non, c'est une longueur d'un tableau (tableau différent), elle est seulement connue au moment de l'exécution. –

Répondre

0

Ceci n'est pas destiné à être une réponse définitive, mais simplement un exemple de ce que vous pourriez accomplir en utilisant stackalloc et un code dangereux.

public unsafe class Example 
{ 
    [DllImport("library.dll")] 
    private static extern int CFunction(A* pointerToFirstElementOfArray, int NumberOfArrayElements); 

    public void DoSomething() 
    { 
    A* a = stackalloc A[LENGTH]; 
    CFunction(a, LENGTH); 
    } 
} 

En outre, faites attention à l'emballage de la structure que l'API accepte. Vous devrez peut-être jouer avec la propriété Pack de l'attribut StructLayout. Je crois que la valeur par défaut est 4, mais certaines API 1.

attendre

Edit:

Pour que cela fonctionne, vous devrez changer la déclaration de A d'une classe à une struct.

public struct A 
{ 
    public int data; 
} 
+0

Je reçois l'erreur suivante: _Ne peut pas prendre l'adresse de, obtenir la taille de, ou déclarer un pointeur sur un type géré ('A') _ –

+0

@Rekreativc: J'ai mis à jour ma réponse. –

+0

J'ai changé la déchiffrement en une structure mais le résultat est le même ... –