有没有办法在导入C#时修复COM结构成员的顺序?

时间:2011-10-10 08:02:17

标签: c# c++ com com-interop idl

我在C ++项目的.idl文件中定义了一个struct,该struct包含一个VARIANT成员。

[uuid(C42A456C-C139-4339-A023-F9458C8A7386)]
struct TEST_STRUCT
{

    int                 Type;
    VARIANT             DateTime;
    float               Result;
};

界面是:

[id(1), helpstring("Test1")] HRESULT Test1([in] int nID, [out, retval] SAFEARRAY(struct TEST_STRUCT)* ppVal);

然后我通过“添加引用”将此结构导入C#项目,但成员顺序已更改。它看起来像这样:

namespace ASLib
{    
    [Guid("C42A456C-C139-4339-A023-F9458C8A7386")]
    public struct TEST_STRUCT
    {
        public object DateTime;
        public int Type;
        public float Result;
    }
}

在C#中将DateTime成员的顺序更改为第一个,当C#调用该接口时,它导致Interop.COMException“Bad variable type”。

那么有什么方法可以修复COM idl文件中struct成员的顺序?非常感谢。

1 个答案:

答案 0 :(得分:0)

您可以通过StructLayout手动修复结构布局。

FieldOffset属性添加到生成的字段中。

它可能类似于:

public struct TEST_STRUCT
{
    [FieldOffset(4)]
    public object DateTime;
    [FieldOffset(0)]
    public int Type;
    [FieldOffset(8)]
    public float Result;
}