【问题标题】:Where is "Inherits <baseclass>" in an Interop UserControl?Interop UserControl 中的“继承 <baseclass>”在哪里?
【发布时间】:2010-01-06 03:22:55
【问题描述】:

我正在研究作为“Interop Forms Toolkit”2.0 版一部分的Interop UserControl 机制。 (这是您构建一个可以作为 COM 对象发布以在 VB6 表单上使用的 .Net UserControl。)

我使用“VB6 Interop UserControl”模板开始了一个新项目,我看到的是一个如下所示的类定义:

    <ComClass(InteropUserControl.ClassId, InteropUserControl.InterfaceId,       
        InteropUserControl.EventsId)> _
    Public Class InteropUserControl

  + VB6 Interop Code

        'Please enter any new code here, below the Interop code

    End Class

没有任何“继承”声明。但是如果我查看类浏览器,我可以看到这个类(毫不奇怪)继承自 WinForms UserControl 类。类声明的“Inherits UserControl”部分怎么可能在任何地方都不可见?

问题 634559 还显示了一个没有任何“继承 UserControl”语句的 InteropUserControl 类声明。我必须从我的 VB.Net 知识中遗漏一些简单的东西。 (我的大部分 .Net 工作都是用 C# 完成的。)

任何理解这一点的帮助将不胜感激。

【问题讨论】:

    标签: vb.net inheritance com-interop


    【解决方案1】:

    我相信 可以作为向编译器添加一些接口的信号。

    I've found one source for that behavior.

    在这种情况下,继承可能会发生类似的重写。

    【讨论】:

    • 我阅读了引用的文章,虽然信息很有趣并且与我正在做的事情相关,但没有任何迹象表明属性可以更改属性所在类的基类展示。我仍然想知道一个类定义为什么不能包含“继承”子句,但系统仍然神秘地计算出基类。
    • 显然在某处进行了一些重写以添加继承子句,即使它从未出现在源代码中。该文章表明,响应属性的这种行为并非史无前例,即使确切的行为(添加Implements 子句)与您的情况不同。
    • “重写”正是所有属性所做的,因为它们改变了生成的代码/IL。
    【解决方案2】:

    VB.Net 编译器会自动添加Inherits UserControl。使用Reflector 查看您的课程以查看此内容。除此之外,它还添加了Implements _InteropUserControl。所以当你这样写你的类时:

    <ComClass(InteropUserControl.ClassId, InteropUserControl.InterfaceId,
        InteropUserControl.EventsId)> _
    Public Class InteropUserControl
    
        ...
    

    它会在 Reflector 中看起来像这样:

    <DesignerGenerated(), ComClass("a2ee6169-9a0d-4930-b8bb-ee71307c43b3",
        "75ff3d57-6448-40ac-a294-68252180cacd", "2b04895c-43f8-44b3-b187-00556ef53a6a"),
        Guid("a2ee6169-9a0d-4930-b8bb-ee71307c43b3"),
        ClassInterface(ClassInterfaceType.None),
        ComSourceInterfaces("VBControl.InteropUserControl+__InteropUserControl")> _
    Public Class InteropUserControl
        Inherits UserControl
        Implements _InteropUserControl
    
        ...
    

    【讨论】:

    • 我可以看出这是在幕后发生的。我想回答的问题是,是什么告诉 VB.Net 编译器这样做?新类应该从 UserControl 继承(并实现 _InteropUserControl)的指示似乎完全不可见,这似乎很奇怪。
    • 什么意思?该属性本身告诉编译器添加它。就像写公共类告诉编译器一些事情一样,属性也告诉编译器一些事情。
    猜你喜欢
    • 2011-01-16
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    相关资源
    最近更新 更多