2009-11-10 5 views
1

C# struct défini comme:Comment faire passer ce tableau struct au code non managé?

[StructLayout(LayoutKind.Sequential)] 
    public struct RecognizeResult 
    { 
     /// float 
     public float similarity; 

     /// char* 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string fileName; 
    } 

c function signature: 
void FaceRecognition(RecognizeResult *similarity); //where similarity is a pointer to an array 

signature P/Invoke:

[DllImport(DllName, EntryPoint = "FaceRecognition")] 
    public static extern void Recognize(ref RecognizeResult similarity); 

c'est comment j'appelle la fonction C++ en code managé:

RecognizeResult[] results = new RecognizeResult[100]; 
Recognize(ref results[0]); //through p/invoke 

il se trouve le tableau ne peut pas être passé au code non managé, seul le premier élément est passé. comment dois-je faire pour passer un tableau au code non managé (est-ce même possible)?

BTW, Dois-je épingler la matrice lors de l'appel de code non géré afin que GC ne déplace pas la matrice?

+0

Comment votre P/déclaration de fonction Invoke ressemble en C#? En particulier, comment mariez-vous l'argument? –

+0

@Rudolph, je ne sais pas comment marshaler le tableau. – Benny

Répondre

1

Essayez ceci:

[DllImport(DllName, EntryPoint = "FaceRecognition")] 
public static extern void Recognize(RecognizeResult[] similarity); 

RecognizeResult[] results = new RecognizeResult[100]; 
// fill array elements 
Recognize(results); 
+0

cela fonctionne, comment je suis stupide. – Benny

+0

@Dimitrov, Ai-je besoin d'épingler le tableau dans le cas où le GC déplace le tableau? – Benny

+0

Cela dépend de ce que fait la fonction native avec le pointeur. Si elle stocke dans une variable statique qui est utilisée plus tard par d'autres fonctions natives alors oui, vous devez épingler le pointeur, sinon vous devriez être ok. –

Questions connexes