COM接口C#编组数组

时间:2018-10-24 13:04:39

标签: c# c++ arrays com marshalling

我有一个用C ++编写的COM服务器,该服务器应与用C#编写的客户端进行交互。 C ++ COM服务器将接口函数导出到一个结构,该结构包含内部带有数组的结构数组

struct InnerStruct  { int innerArray[ 100 ]; }
struct OuterStruct  { int dummy; InnerStruct outerArray[ 2 ]; }

所以结构的大小固定。

IDL描述为

HRESULT SetStruct( [in] const OuterStruct* par, [out, retval] int code );
HRESULT GetStruct( [out] OuterStruct* par, [out, retval] int code );

IDL编译正常,我可以在C#客户端中看到该结构。

问题在于,当我从C#客户端调用接口函数时,我仅在OuterStruct中的第一个InnerStruct中获取/设置值。 第二个InnerStruct仅保存垃圾。

C#调试器显示了OuterStruct的正确结构,并且知道OuterStruct内部有2个InnerStruct。

在C#中,接口函数的声明来自服务器图元文件,因此更改描述并不容易。

我试图在in和out参数上设置一个size_is(),但MIDL编译器不会接受。

我可以在参数上设置一些特定的封送处理吗,或者如何解决获得完整的OuterStruct槽式COM的问题?

1 个答案:

答案 0 :(得分:0)

在我的IDL文件中,我试图写

typedef [transmit_as(OuterStructAliasType)] OuterStruct* HelpType;

,并将其他声明保留为

HRESULT SetStruct( [in] const OuterStruct* par, [out, retval] int code );
HRESULT GetStruct( [out] OuterStruct* par, [out, retval] int code );

我在C ++代码中定义的位置

typedef struct OuterStructAliasType
{
    char    dummy[ sizeof( OuterStruct )];
} OuterStructAliasType;

这似乎有效。 可能还有其他方法可以达到目的。 请告诉我他们更聪明或更出色。