2009-11-10 72 views
1

C#結構定義爲:如何將此結構數組傳遞給非託管代碼?

[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 

P /調用簽名:

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

這是我如何調用C++函數在託管代碼:

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

原來陣列不能傳遞給非託管代碼,只傳遞第一個元素。 我應該如何將數組傳遞給非託管代碼(它甚至可能)?

BTW,我一定到引腳排列調用非託管代碼時,使GC將不會移動陣列?

+0

請問你的P/Invoke函數的聲明看起來像在C#中?特別是,你如何調整論點? – 2009-11-10 07:22:32

+0

@Rudolph,我不知道如何編組數組。 – Benny 2009-11-10 07:28:44

回答

1

試試這個:

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

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

它的工作,我是多麼愚蠢。 – Benny 2009-11-10 07:33:02

+0

@Dimitrov,在GC移動數組的情況下是否需要固定數組? – Benny 2009-11-10 07:34:28

+0

這取決於本機函數對指針做了什麼。如果將它存儲在稍後由其他本機函數使用的靜態變量中,那麼是的,您需要固定指針,否則應該沒問題。 – 2009-11-10 07:42:34

相關問題