具有托管子类的非托管基类

时间:2009-09-02 02:04:18

标签: .net interop unmanaged swig

是否有可能:

  1. (非托管)C ++中的纯抽象类(基本上是一个接口)
  2. 在< insert .net language of your choice>
  3. 中管理此类的实现
  4. 从(非托管)C ++
  5. 中使用这些托管实现

    使用SWIG或某些C ++ / CLI粘合剂?

2 个答案:

答案 0 :(得分:1)

您通常可以编写自定义C ++ / CLI粘合剂来包装非托管包装中的托管对象或托管包装器中的非托管对象。如果您不想使用此方法,您还可以利用COM和“COM / .NET互操作”。换句话说,您可以在COM .idl文件中声明您的接口;一旦你完成了这个,你应该能够在非托管代码和托管代码(C ++,C ++ / CLI,C#等)中使用(和实现)接口。

在C ++(非托管或其他方式)中,您可以#import idl或#include您的编译器在通过midl.exe“编译”idl后生成的头文件。对于C#,您可以在C ++ / CLI中编写一些托管API来包装COM接口,也可以使用tlbimp.exe从midl生成的COM类型库(.tlb)自动神奇地生成托管程序集。这个“互操作程序集”可以由任何常规的旧托管程序集直接引用。

(如果您不熟悉COM或COM / .NET互操作,这可能看起来有点神秘或神奇;有关如何将COM组件公开给.NET的更多信息,请here's some background material on MSDN启动。)

成功将有问题的COM组件暴露给.NET后,在.NET中实现其中一个导出的COM接口应该像在C#或C ++ / CLI中定义一个继承自有问题的界面。

至于要求#3 ......你如何去做它真的取决于你想要解决的更广泛的问题。一旦你以某种方式将对托管对象(实现COM接口)的引用传递给本机代码,该代码实际上只能使用该对象,就像它是本机COM对象一样;它可以 - 在大多数情况下 - 仍然没有意识到使用哪种语言来实现所需的COM接口。如果您提供有关问题上下文的其他详细信息,我们可能会提供有关如何实现此问题的其他指示。

答案 1 :(得分:1)

SWIG是您要在此处使用的工具。具体来说,使用SWIG directors。从在线文档:

  

SWIG director功能为生成的C#代理类添加了额外的代码,使这些类能够用于跨语言多态。从本质上讲,它使非托管C ++代码能够回调为虚拟方法的托管代码,以便 C#类可以从包装的C ++类派生

这很简单,虽然细节中有魔鬼。对对象的生命周期要非常小心 - 你正在处理两种不同的内存管理方法,如果你不小心,很容易得到无效的指针。但这是另一个故事;)