是否可以使COM的成员只对COM可见,即不对托管代码可见?这是一个具体的例子:
假设我有一个Widget
类,其DateSubmitted
属性是可以为空的日期(即DateTime?
);它可能尚未“提交”,因此DateSubmitted
值可能为null
。当我从另一个托管程序集引用我的程序集时,我想使用此属性。但是,当我从COM环境(例如VBA)引用我的程序集时,该属性将不可用,因为COM对.NET中的可空类型一无所知。
理想情况下,我希望有另一个属性,它只是一个普通的“日期”类型,因此它对COM可见,并且可能是一个布尔标志,用于在日期为空时向COM API用户指示,我不希望这些属性在.NET中可用。
我想我想知道的是,是否存在某个属性或某些东西,可能在System.Runtime.InteropServices
中的某个位置,这将允许我有效地隐藏.NET中的成员但使其在COM中可用。
答案 0 :(得分:3)
不,成员必须 public 才能从COM服务器使用。这是一个相当简单的解决方法,COM客户端只看到接口,.NET程序员看到类。因此,您可以在界面中公开DateTime方法,并在类中显式实现它,使其不公开。并提供DateTime的公共版本?在课堂上的论点。
还要记住,通过为COM客户端提供[ComVisible(false)]属性来隐藏方法。您可以通过赋予[EditorBrowsable(EditorBrowsableState.Never)]属性来隐藏.NET程序员的方法。这隐藏在IntelliSense弹出窗口中。