2011-01-31 139 views
0

我想在C#中使用C++ DLL,並在具有特定功能的兩者之間存在一些問題。從C#應用程序使用C++庫時的編組錯誤

在C++函數的定義爲:

byte* GetEntityUserData(TEntity entity) 

在C#中,我把它定義爲:

[DllImport(EngineDll)] 
public static extern object[] GetEntityUserData(TEntity entity); 

當我嘗試做以下用途:

object[] o = LE.GetEntityUserData(entity); 

我收到以下錯誤:

Cannot marshal 'return value': Invalid managed/unmanaged type combination.

C#程序編譯,但它給出了運行時錯誤。

+1

將C++聲明更改爲void *,這更準確地表示「這是一個字節blob,祝你好運將它整理出來」。在管理方面的IntPtr,元帥班級爲其打造了一些意識。顯然它不是一個數組。 – 2011-01-31 01:37:51

回答

3

數據應該表示什麼?我會更改C#簽名以返回byte[],而不是object[]。您將無法從非託管函數獲取引用類型。只有值類型,這意味着原始類型和struct的。

+0

是的,瞭解更多關於C++數據的信息會有所幫助。發送byte *的一個問題(我認爲是char *?什麼是C++端定義的「byte」?)是CLR封送拆收器不知道要封送多少字節,所以您可能需要提供更多信息給marshaler(通過MarshalAsAttribute),但爲了提供良好的指導,我們需要知道數據究竟會是什麼或者調用者知道字節中有多少字節* – 2011-01-31 00:31:37