1

是否有可能:

  1. (非托管)C++ 中的纯抽象类(基本上是接口)
  2. 已使用 <插入您选择的 .net 语言> 管理此类的实现
  3. 从(非托管)C++ 使用这些托管实现

使用 SWIG 或一些 C++/CLI 胶水?

4

2 回答 2

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 的更多信息,请参阅MSDN 上的一些背景资料,让您开始。)

一旦你成功地向 .NET 公开了相关的 COM 组件,在 .NET 中实现其中一个导出的 COM 接口应该就像在 C# 或 C++/CLI 中定义一个继承自相关接口的新类一样简单.

至于要求#3……你如何去做真的取决于你试图解决的更广泛的问题。一旦您以某种方式将对托管对象(实现 COM 接口)的引用传递给本机代码,该代码实际上可以像使用本机 COM 对象一样使用该对象;它可以——在大多数情况下——幸福地不知道使用哪种语言来实现所需的 COM 接口。如果您提供有关问题背景的更多详细信息,我们可能会提供有关如何实现这一点的其他指示。

于 2009-09-03T07:33:45.063 回答
1

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

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

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

于 2009-09-17T14:32:36.450 回答