-1

我有一个MyAPICOMVisible类,我的客户将用作所有 API 访问的根对象。

我的 API 在另一个程序集OtherAPI中,该程序集具有DocumentWindow API 类(COM 不可见)。

我想通过MyAPI类将DocumentWindow类公开给后期绑定客户端,例如 JavaScript。

[COMVisible(true)]
class MyAPI
{
    public OtherAPI::Document NewDocument()
    {
        return new OtherAPI::Document();
    }
}

// Something like this should work in the client code
(new MyAPI()).NewDocument().GetName();

问题是它没有看到GetName,因为COM visible我认为这不是。

我可以在这个类中包装 Document 和 Window 类中的每一个函数,但我正在寻找一个优雅的解决方案。我希望我的客户端应用程序能够通过 MyAPI 对象同时使用 Document 和 Window 类函数。

4

1 回答 1

0

你需要阅读文档...

突出显示的重要部分,供您观赏 :)

ComVisibleAttribute 类

将特定类型的属性设置为 false 会隐藏该类型及其成员。但是,如果类型不可见,则不能使该类型的成员可见。将类型的属性设置为 false 可防止将该类型导出到类型库;课程未注册;接口永远不会响应非托管 QueryInterface 调用。

然而!

除非您将一个类及其成员显式设置为 false,否则继承的类可以暴露给原始类中不可见的COM 基类成员。例如,如果将ClassA设置为 false并且不将属性应用于其成员,则该类及其成员对 COM 是不可见的。但是,如果从ClassA派生ClassB并将 ClassB导出到 COM,则ClassA成员将成为 ClassB 的可见基类成员。

所以读起来很清楚。

如果您已将父类成员标记为 false,则无法公开它们,但是如果只有父类被标记为 false(并且该成员未明确标记为 false),则可以公开它们。

否则,您将不得不再次重新实现它们......对不起,今天没有免费的午餐

于 2018-02-08T06:12:01.923 回答