【发布时间】:2010-12-24 04:52:41
【问题描述】:
假设我有一个实现 IBaseClass 的类 BaseClass
然后我有一个接口 IClass 继承了 IBaseClass。
然后我有一个名为 class 的类,它实现了 IClass。
例如:
[ComVisible(true), InterfaceType(ComInterfaceType.IsDual), Guid("XXXXXXX")]
public interface IBaseClass
{
[PreserveSig]
string GetA()
}
[ComVisible(true), InterfaceType(ComInterfaceType.IsDual), Guid("XXXXXXX")]
public interface IClass : IBaseClass
{
[PreserveSig]
string GetB()
}
[ComVisible(true), ClassInterface(ClassInterfaceType.None), Guid("XXXXXXX")]
public class BaseClass : IBaseClass
{
public string GetA() { return "A"; }
}
[ComVisible(true), ClassInterface(ClassInterfaceType.None), Guid("XXXXXXX")]
public class Class : BaseClass, IClass
{
public string GetB() { return "B"; }
}
当暴露给 COM 时,如果我创建一个“类”实例,它不允许我调用 GetA()。
在 .tlb 文件中查看我的 IDL 时,我的 IClass 界面如下所示:
[
odl,
uuid(XXXXXXXXXXXXXXXXXXXXX),
version(1.0),
dual,
oleautomation,
]
interface IClass : IDispatch {
[id(0x60020000)]
BSTR GetB();
}
它甚至不像 IClass 派生自 IBaseClass!
如果我取出 IClass 从 IBaseClass 派生的位置并将方法添加到接口中,它就可以工作。
如何让 C# 在 COM 中启用这种继承?当我可以继承它们时,我宁愿不重新实现接口。
废话:检查此链接.Net COM Limitation
如果有人知道为什么会这样,或者比复制粘贴到我的“派生”界面有更好的解决方法,请告诉我。如果没有,我会在几天内标记答案。
【问题讨论】:
-
您需要查询其他接口才能访问其中的方法。根据您使用对象的语言,它可能不方便。要解决它,您需要为每个类创建一个“平面”接口,或者让编译器使用“ClassInterface”为您完成(还有其他问题)
-
如果您看到我的链接,回答者提到.Net 在导出时不会将基本接口应用于 COM 接口。所以换句话说,你必须复制粘贴基础接口定义来模拟基础接口。
-
我认为您应该发布自己的 .Net COM 限制链接作为答案 - 这是正确的解决方案,如果您自己想通了,建议您发布自己的答案。
标签: c# .net inheritance com