导入到 C# 时有什么方法可以修复 COM 结构成员的顺序吗?

发布于 2024-12-09 03:39:27 字数 835 浏览 0 评论 0原文

我在C++项目的.idl文件中定义了一个结构体,该结构体包含一个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# 中更改为第一个,当 C# 调用该接口时,它导致 Interop.COMException“错误的变量类型”。

那么有什么办法吗?修复 COM idl 文件中结构成员的顺序?多谢。

I defined a struct in .idl file of C++ project, and the struct contained one VARIANT member.

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

    int                 Type;
    VARIANT             DateTime;
    float               Result;
};

The interface is:

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

Then I imported this struct into C# project via "Add Reference", but the member order was changed. It looks like this:

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

The order of DateTime member was changed to first in C#, it caused an Interop.COMException "Bad variable type" when C# calls that interface.

So is there any way to fix the order of struct members in COM idl file? Thanks a lot.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

伊面 2024-12-16 03:39:27

您可以通过 结构布局

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

它可能会是这样的:

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

You can fix the struct layout by hand via StructLayout.

Add the FieldOffset attribute to the generated fields.

It'll probably be something like:

public struct TEST_STRUCT
{
    [FieldOffset(4)]
    public object DateTime;
    [FieldOffset(0)]
    public int Type;
    [FieldOffset(8)]
    public float Result;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文