2012-09-21 41 views
0

我想將從c#庫導出的結構數組傳遞給C++代碼。目標是將struct的SAFEARRAY從C++傳遞給c#。通過COM Interop來管理受管結構的SAFEARRAY

我按照說明書從

http://limbioliong.wordpress.com/2011/07/16/marshaling-a-safearray-of-managed-structures-by-com-interop-part-2/

,但得到這個錯誤與呼叫GetRecordInfoFromTypeInfo

0x80028019舊格式或無效的類型庫。

+0

是否有一個原因,這沒有幫助(http://stackoverflow.com/questions/12503041/passing-an-array-of-structs-from-c-sharp-to-c-使用-COM可調用的包裝器/ 12508525#12508525)?你真的需要有SAFEARRAY嗎?它是否必須是一個結構?你需要實現一個調度接口嗎? –

+0

較早的嘗試是將結構從C#傳遞給C++,現在我正在做相反的事情。 LPArray編組的問題在於它僅編組數組中的一個元素,而變長數組未綁定到C#簽名中定義的數組。所以我不得不將它改爲Safearray。如果以前的方法沒有任何改變,請告訴我。 – TrustyCoder

+0

然後這個部分有點令人困惑:「我試圖將一個從c#庫導出的結構數組傳遞給C++代碼」。我很驚訝,LPArray只編組一個元素(從非託管到託管) –

回答

1

如果沒有需要有一個調度接口,下面應該工作:

void MyMethod([MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] MyStruct[] data, long size); 

如果您需要使用SAFEARRAY,我希望下面的工作(但我不是100%肯定,我不必在目前可用的Windows機器):

void MyMethod([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_USERDEFINED)] MyStruct[] data); 

如果你能負擔得起改變你structclass那麼這也將正常工作,並節省您的UDT麻煩:

void MyMethod([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_UNKNOWN)] MyStruct[] data); 
+0

我如何使用大小與MyStruct []數據中的第一個簽名在c# – TrustyCoder

+0

好吧SizeParamIndex是參數的索引,指定的大小。 – TrustyCoder

+0

你會如何編寫應該返回safearray回C++到c#的方法? C++和c#端的方法簽名應該是什麼? – John