是否有可能:
- (非托管)C++ 中的纯抽象类(基本上是接口)
- 已使用 <插入您选择的 .net 语言> 管理此类的实现
- 从(非托管)C++ 使用这些托管实现
使用 SWIG 或一些 C++/CLI 胶水?
您几乎总是可以编写自定义 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 接口。如果您提供有关问题背景的更多详细信息,我们可能会提供有关如何实现这一点的其他指示。