2011-01-31 136 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