通过COM Interop对SAFEARRAY的托管结构进行编组

时间:2012-09-21 18:55:56

标签: c# c++ com safearray

我正在尝试将从c#库导出的struct数组传递给c ++代码。目标是将结构的SAFEARRAY从c ++传递给c#。

我已按照

的说明操作

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

但是通过调用GetRecordInfoFromTypeInfo

获得此错误

0x80028019旧格式或无效的类型库。

2 个答案:

答案 0 :(得分: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);

如果您有能力将struct更改为class,那么这也会有效,并让您免于UDT麻烦:

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

答案 1 :(得分:1)

结构是否包含字符串?如果是这样,请确保标记它们[MarshalAs(UnmanagedType.BStr)]。 COM中存在限制:结构数组中的字符串必须是BSTR。 TLBExp默认为LPWSTR,然后调用终止。见这里:http://msdn.microsoft.com/en-us/library/z6cfh6e6(v=vs.100).aspx