【问题标题】:Hiding a member from .NET code but not from COM从 .NET 代码而不是 COM 隐藏成员
【发布时间】:2014-06-17 17:09:58
【问题描述】:

是否可以使类的成员仅对 COM 可见,即对托管代码不可见?这是一个具体的例子:

假设我有一个带有DateSubmitted 属性的Widget 类,该属性是一个可以为空的日期(即DateTime?);它可能尚未“提交”,因此DateSubmitted 值可能是null。当我从另一个托管程序集引用我的程序集时,我想使用此属性。但是,当我从 COM 环境(例如 VBA)引用我的程序集时,该属性将不可用,因为 COM 对 .NET 中的可空类型一无所知。

理想情况下,我想要另一个属性,它只是一个普通的“日期”类型,因此它对 COM 可见,并且可能是一个布尔标志,用于在日期为空时向 COM API 用户指示,我不想要这些属性在 .NET 中可用。

我想我想知道是否有一个属性或其他东西,也许在System.Runtime.InteropServices 的某个地方,这将使我能够有效地从.NET 中隐藏一个成员,但使其在 COM 中可用。

【问题讨论】:

  • 我认为你的意思是相反的:你想隐藏一个成员在 COM 可见但在 .NET 中仍然可见。

标签: .net interop com-interop


【解决方案1】:

不,成员必须是 public 才能从 COM 服务器使用。这是一个相当简单的解决方法,COM 客户端只看到接口,.NET 程序员看到类。因此,您可以在接口中公开 DateTime 方法并在类中显式实现它,使其不公开。并提供带有日期时间的公共版本?类中的参数。

还请记住,您可以通过为 COM 客户端提供 [ComVisible(false)] 属性来隐藏方法。您可以通过为 .NET 程序员提供 [EditorBrowsable(EditorBrowsableState.Never)] 属性来隐藏方法。这会将其隐藏在 IntelliSense 弹出窗口中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2021-03-28
    相关资源
    最近更新 更多