2010-03-31 7 views
3

J'ai un struct C# pour représenter un vecteur cartésienne, quelque chose comme ceci:maréchal struct à un tableau non géré

public struct Vector 
{ 
    private double x; 
    private double y; 
    private double z; 

    //Some properties/methods 
} 

Maintenant, j'ai un dll non géré C que je dois appeler avec P/Invoke. Certaines méthodes attendent un double [3] paramètre.

La signature non géré C est quelque chose comme

void Cross(double a[3], double b[3], double c[3]); 

Est-il possible de mettre en place une signature P/Invoke Je peux passer des instances de mon struct Vector et les rassembler de manière transparente à une double non géré [3]? J'aurais aussi besoin d'un marshaling bidirectionnel car la fonction non managée a besoin d'écrire la sortie dans le tableau d'arguments, donc je suppose que je devrais l'utiliser comme LpArray.

Répondre

4

Vous pouvez trouver dans votre déclaration P/Invoke, les membres s'aligneront correctement sur toutes les architectures CPU actuelles pour être lisibles comme un tableau en code non managé:

[DllImport("blah.dll")] 
private static extern void Cross(ref Vector a, ref Vector b, ref Vector c); 
+0

Ouch ... si simple! Cela a très bien fonctionné. Merci beaucoup – Pedro

0

Je n'ai pas mes compilateurs à la main, mais je me demande si vous pouvez utiliser quelque chose comme

[MarshalAs(...)] 
[StructLayout(LayoutKind::Sequential, Pack=1)] 
public struct Vector 
{ 
    private double x; 
    private double y; 
    private double z; 

    //Some properties/methods 
} 

Voir here et here et here

Questions connexes