【问题标题】:.NET: Make an object and all of its subordinate objects COM visible.NET:使对象及其所有从属对象 COM 可见
【发布时间】:2018-03-08 21:35:34
【问题描述】:

我有一个带有类的专有程序集,它需要是 COM 可见的,所以我可以将它与其他(非 .NET)应用程序一起使用。

想象一个这样的类:

public class CProprietary
{
    public CProprietary2 oSubItem;
}

public class CProprietary2
{
}

这些类是专有的,COM 不可见。我没有它们的源代码。作为当前的解决方案,我正在创建自己的程序集,它提供了一个继承的 COM 可见类。

[ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)]
public class CComVisibleProprietary : CProprietary
{
}

现在我可以通过 COM 使用基类 (CProprietary),但是在访问 CComVisibleProprietary.oSubItem 时,从属类 (CProprietary2) 的对象仍然返回非 COM 可见。

所以我的问题是我需要一种方法来自动包装一个类及其所有子类。或者有什么简单的方法可以将 ComVisible 属性继承给子类? 这些专有类的某些属性也返回 .NET 的对象,如 System.Windows.Forms.ListBox.ObjectCollection,因此它们不属于同一个命名空间。

【问题讨论】:

  • 你有 [assembly:ComVisible(true)] 属性(在 AssemblyInfo.cs 中)吗?见stackoverflow.com/questions/15688395/…
  • 使用 [ClassInterface] 并不是一个很好的暴露成员的方法。 COM 使用基于超纯接口的范例。 [ClassInterface] 很方便,它从类声明中合成一个接口,但是不可见的保持不可见。总是倾向于显式声明一个公共接口,给它 [ComVisible] 属性。好的原因有很多,一个是它可以解决您的问题。您现在可以包含由基类实现的属性和方法。
  • @Cal279:AssemblyInfo.cs 中的 ComVisible 没有帮助。 :(
  • @HansPassant:我应该如何在不使用 ClassInterface 的情况下使属性类 COM 可见?我想我需要创建一个包含所有属性和方法的副本的接口吗?我不赞成这样做。
  • 机器不太在乎你喜欢什么,考虑做你需要做的事情让它工作。不排除发送该电子邮件以要求作者为您做这件事。

标签: c# .net com activex comvisible


【解决方案1】:

“自动化视图”的正确方法是为每个嵌入对象 (CProprietary2) 创建自己的对象。每个嵌入对象都可以通过使用主对象(CProprietary)中的属性并返回嵌入对象的接口来访问。

但是没有自动的方法来实现这一点。您必须为所有对象提供相应的接口。

VBScript中的语法,当prop是CPropriatary类型时,可以这样访问子项。

prop.oSubItem.DoSomething

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 2011-06-20
    • 2010-12-07
    • 2020-02-21
    • 2017-09-13
    • 2018-07-11
    • 2011-07-19
    • 2020-06-08
    相关资源
    最近更新 更多