Есть ли способ исправить порядок членов структуры COM при импорте в C #? - PullRequest
1 голос
/ 10 октября 2011

Я определил структуру в .idl файле проекта C ++, и структура содержала один член 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;
    }
}

Порядок элемента DateTime был изменен на первый в C #, это вызвало Interop.COMException «Неверный тип переменной», когда C # вызывает этот интерфейс.

Так есть ли способ исправить порядок членов структуры в файле COM idl?Большое спасибо.

1 Ответ

0 голосов
/ 10 октября 2011

Вы можете исправить структуру структуры вручную с помощью StructLayout .

Добавить атрибут FieldOffset к сгенерированным полям.

Вероятно, это будет что-то вроде:

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