从非托管C ++调用C#传递或返回“复杂”类型

时间:2010-03-06 21:03:20

标签: c# c++ com interop marshalling

我在如何使用复杂对象作为返回值或作为参数传递给暴露给非托管C ++作为COM组件的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 [],另一个返回一个包含每个列字段的字符串[]的结构和一个描述其他成员数组长度的int计数成员。

在C#方面,我认为这将是一个定义和公开许多请求/响应结构的情况,这些结构将用于传入/传出数据。这些结构需要使用属性进行修饰,这些属性会导致其成员不会因优化而“改变位置”。结构成员可能需要使用属性进行修饰,该属性向marshaller提示如何在COM中公开成员。

然后我当然要弄清楚如何实例化和填充这些结构,从非托管C ++看作COM对象,然后我必须在方法调用中传递它们并将它们作为返回值处理。

这对我来说是最困难的部分;我理解C ++和一些MFC / ATL但C ++下的COM是一个额外的复杂程度。任何推荐的书籍,博客,关于参数传递和返回值处理主题的教程,如我所描述的那样确实非常​​有用。

1 个答案:

答案 0 :(得分:2)

如果可能的话,我会避免将COM引入图片中。如果您控制C ++代码(听起来就像这样),那么添加一个调用C#代码的C ++ / CLI cpp文件会更容易。 C ++ / CLI可以直接访问和创建托管和非托管类型,并在它们之间进行复制。