【发布时间】:2011-01-24 13:04:27
【问题描述】:
我正在寻求有关如何使用复杂对象作为返回值或作为参数传递给作为 COM 组件暴露给非托管 C++ 的 C# 类方法的帮助
原因如下:
我正在处理一个项目,我们有六个非托管 C++ 应用程序,每个应用程序都直接访问同一个 Microsoft SQL Server 数据库。我们希望能够以最少的更改使用 MS-Sql/Oracle/MySql,我们决定实现业务逻辑和通过 WCF 服务公开的数据层以获得所需的灵活性。
此策略取决于能否让非托管 C++ 与 WCF 服务互操作。有很多方法可以做到这一点,但我要遵循的策略是创建一个作为 COM 组件公开的 C# 程序集,它将充当 C++ 和 WCF 层之间的桥梁。此 C# 程序集将作为 COM 组件加载到非托管 C++ 进程中。
C# 桥程序集将包含一个帮助器类,该类具有许多描述以前在 C++ 代码中表示为直接 sql 或存储 proc 调用的操作的方法。
我有两个问题要解决
1) 对于 INSERT,我需要传递一个表示要插入的实体的对象。在非托管 C++ 方面,我已经知道其中一个实体有大约 40 个属性必须将其放入 SQL 中——我不想要具有 40 个参数的 C# 方法,我想传递一个对象;我不知道如何通过 COM 将 C++ 对象编组到 C# 中,所以我考虑在 C# 端定义一个 Stuct,然后使 Struct COM 可见。
2) 如何返回“SELECT this, that, other, ...”的结果。我见过两个例子。一个返回一个 struct[],另一个返回一个结构,其中包含每个列字段的 string[] 和一个描述其他成员数组长度的 int count 成员。
在 C# 方面,我认为这将是定义和公开许多请求/响应结构的情况,这些结构将用于传入/传出数据。这些结构需要用属性进行修饰,使其成员不会因为优化而“改变位置”。并且结构成员可能需要使用向编组器提示该成员应如何在 COM 中公开的属性进行修饰。
当然,我必须弄清楚如何从非托管 C++ 中将这些结构作为 COM 对象实例化和填充,然后我必须在方法调用中传递它们并将它们作为返回值处理。
这对我来说是最困难的部分;我了解 C++ 和一些 MFC/ATL,但 C++ 下的 COM 是一个额外的复杂级别。任何推荐的关于参数传递和返回值处理主题的书籍、博客和教程都会非常有帮助。
【问题讨论】:
标签: c# c++ com interop marshalling