创建要在 C# 中使用的托管 C++ 接口

Posted

技术标签:

【中文标题】创建要在 C# 中使用的托管 C++ 接口【英文标题】:Creating a Managed C++ interface to use in C# 【发布时间】:2015-05-21 22:56:49 【问题描述】:

我们有一组原生 C++ 业务规则,它们封装在 C++/CLI 中,然后由 C# 层封装,因此我们可以通过 DCOM 公开它。

Native C++ 业务规则位于 DLL 中,并且可以在 COM 可见 DLL 中的 C++/CLI 中轻松调用。然后我们将此 DLL 添加为对 C# 项目的引用。

C# 层有很多派生自 ServicedComponent 的类,我们应用 regsvcs 将其注册为 DCOM 服务器。

但是,C++/CLI 层需要与 C# 层进行通信。为此,我正在考虑使用 C# 风格的界面。 C# 层将从接口派生,并将其传递给 C++/CLI 层,然后 C++/CLI 层可以调用其上的方法以在 C# 层中发生某些事情。这个接口需要在 C++/CLI 层中声明,但为了可见性。这是我的问题,我似乎无法做到这一点。

有没有办法在 C++/CLI 中声明一个 C# 风格的接口,然后在 C# 中使用它?

【问题讨论】:

"Managed C++" 指的是带有托管扩展的 Visual C++,就像在 Visual Studio .NET 2003 中一样。您可能指的是它的后续 C++/CLI。如果是这样,请改写并更改标签。 已按建议更改。 【参考方案1】:

有(https://msdn.microsoft.com/en-us/library/737cydt1.aspx):

#pragma managed
using namespace System;

public interface class MyInterface

    void MyFunction();

并在C#中使用:

public class MyClass : MyInterface

    public void MyFunction()  

【讨论】:

如果我这样声明,我就明白了。错误 CS0246:找不到类型或命名空间名称“MyInterface”(您是否缺少 using 指令或程序集引用?) 顺便说一句,汇编和使用语句在那里。如果我从派生 MyInterface 的类中删除方法 MyFunction,我会收到 Intellisense 错误“未实现接口成员 xxx” 我编辑答案以准确显示我编译的内容而没有错误。我正在使用 VS2013。 好的,但是如何在 C# 程序集中使用 C++/CLI 接口而不会出错。由于某种原因,我收到错误。 你需要一个类来实现接口。

以上是关于创建要在 C# 中使用的托管 C++ 接口的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 非托管 dll 传递 C# 函数

使用 COM 互操作从非托管 C++ 访问 c# 属性

从 C# 如何调用需要 *VARIANT 参数的非托管 OLE 接口?

非托管C++通过C++/CLI包装调用C# DLL

如何添加实现 C++ 接口的标签?

在 C++ 中使用 C# 接口或在 C# 中使用 C++ 接口