Per favore, sopportare me come sono nuovo per lo smistamento. Ho una struttura C e funzione dichiarata come segue:Marshalling di struttura C in C#
typedef struct
{
char* name;
BT_ADDR address;
} DeviceList;
extern "C" _declspec(dllexport)DeviceList* PerformQuery();
La struttura BT_ADDR è la stessa struttura definita in wsbth2.h in Windows CE SDK. PerformQuery restituisce un puntatore a un array di DeviceList.
Nel mio programma C#, eseguo la seguente dichiarazione PInvoke come seguito
[StructLayout(LayoutKind.Sequential)]
struct DeviceList
{
public string name;
public ulong address;
}
[DllImport("BT_Conn.dll")]
public extern static DeviceList[] PerformQuery();
Dopo aver eseguito il programma di C#, un NotSupportedException viene restituito. Potete gentilmente consigliarmi cosa c'è di sbagliato nel mio marshalling?
Hi Saxon, L'API PerformQuery() restituirebbe effettivamente più di un elemento. Per determinare la lunghezza dell'array, userei sizeof (* devList)/sizeof (DeviceList) in C++, ma come dovrei dichiarare la mia API per informare il marshaller sul numero di elementi nell'array restituito? –
@CK: In C++ 'sizeof (* devList)' restituirà 'sizeof (DeviceList)', ovvero la dimensione di un singolo oggetto. Se hai un puntatore 'DeviceList *', allora il compilatore non può sapere quanti oggetti ci sono. È solo se si dispone di un array 'DeviceList []' (con un numero fisso di elementi) che sizeof può restituire l'intera dimensione dell'array. –
@CK: A proposito, è PerformQuery() una funzione che stai scrivendo, o è una funzione in una DLL esistente con cui devi interfacciarti? –