如何从c++ COM组件返回和使用自定义结构对象到c#应用程序

How to Return and consume custom struct object from C++ COM component into C# application

本文关键字:结构 自定义 对象 应用程序 c++ COM 返回 组件      更新时间:2023-10-16

我在c++中创建了一个简单的COM组件,并添加了一个这样的方法

interface IMathControl : IDispatch{
    HRESULT AddTwoNumbers(
                [in]  DWORD Number1,
                [in]  DWORD Number2,
                [out] DWORD *pResult
            );
};

我已经在我的c#应用程序中使用了上述组件,它工作得很好。

现在,c++中定义了一个结构体

struct AttributeValueInfo
{
    string attribute;
    string value;
    string description;
};

我的问题是:

如何在我的c++ COM组件中定义一个应该返回AttributeValueInfo类型结果的方法?

我将如何在c#应用程序中使用生成的struct AttributeValueInfo ?

我想我需要做封送,但不知道从哪里开始。谁能指出上述场景的步骤或简单的代码片段?

不可能。只有c++编译器才能生成代码来正确读取std::string的值。附加的限制是,它是具有exact相同设置并使用exact相同内存分配器的exact相同版本的编译器。标准c++类的互操作能力与砖石的互操作能力相比是不利的。c++没有任何类似于c#的VM保证,确保像对象布局和分配这样的基本规则对进程中运行的任何代码都是有保证的。

必须使用具有互操作保证的字符串类型。这是COM中的BSTR,由CLR直接支持和假设。

使用结构体也是相当麻烦的,它们的布局严重依赖于编译器的设置。结构的声明必须出现在您编写的类型库中,CLR将使用IRecordInfo接口安全地访问结构成员。否则,当你意识到一个结构相当于一个只有属性的类时,这种限制就消失了。