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

2019-10-20 05:25发布

我如何使用复杂的对象无论是作为返回值的帮助后,我或作为参数传递给C#类的方法暴露在非托管C ++的COM组件传递

这是因为:

我工作的一个项目,我们有各自直接访问相同的Microsoft SQL Server数据库半打非托管C ++应用程序。 我们希望能够使用MS-SQL /甲骨文/ MySQL的以最小的变化,我们已经决定通过实施WCF服务公开获得所需要的灵活性,业务逻辑以及数据层。

这一战略取决于能够得到的非托管C ++与WCF服务互操作。 有许多方法可以做到这一点,但我想跟进的策略是创建公开为COM组件将作为℃之间++和WCF层的桥梁C#组件。 此C#组件将被加载到非托管C ++过程作为COM组件。

C#的桥组件将包含有许多描述着以前表现为直接的SQL或C ++代码存储过程调用的操作方法辅助类。

我有两个问题要解决

1)对于一个INSERT,我需要传递给被插入表示的实体的对象。 在托管C ++方面,我已经知道实体的一个大约有40特性,这不得不使之成为SQL - 我不想一个C#方法有40个参数,我想传递一个对象; 我不知道如何封送通过COM C ++对象到C#,所以我想到了在C#侧定义Stuct然后进行结构COM可见。

2)如何返回的“选择这个,那个,其他的......”结果。 我见过两个例子。 一个返回一个结构[]和另一返回包含为每一列字段的字符串[]和描述的其它构件阵列的长度的诠释计数部件的单个结构。

在C#侧,我认为这将是限定并暴露的数,其将被用于输入/输出数据传递的请求/响应结构的的情况。 这些结构将需要与导致其成员不要“改变位置”作为一个优化的结果属性来装饰。 和结构成员可能需要与提示来编组如何成员应在COM暴露的属性来装饰。

然后,当然我得工作,如何实例化和填充这些结构如所见到的COM从托管C ++对象,那么我将不得不通过他们在方法调用和处理它们的返回值。

这对我来说是最困难的部分; 我神交C ++和C在某些MFC / ATL但COM +是一个复杂的整体额外级别。 任何推荐的书籍,博客,在参数传递和为我所描述的返回值的处理的主题教程将确实是非常有用。

Answer 1:

如果可能的话,我会avoing使COM到图片。 如果你控制的C ++代码(这听起来像你这样做),应该是比较容易添加调用到你的C#代码一个C ++ / CLI CPP文件。 C ++ / CLI可以直接访问和创建托管和非托管类型以及它们之间的复制。



文章来源: Calling C# From Unmanaged C++ Passing Or Returning “Complex” Types