2010-01-06 15 views
1

我正在查看Interop UserControl機制,它是「Interop Forms Toolkit」2.0版的一部分。 (這可以創建一個.Net UserControl,可以將其作爲COM對象發佈以用於VB6窗體。)Interop UserControl中的「Inherits <baseclass>」在哪裏?

我已經使用「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 

沒有任何「Inherits」語句。但是,如果我在類瀏覽器中看,我可以看到這個類(並不奇怪)從WinForms UserControl類繼承。怎麼可能是類聲明的「Inherits UserControl」部分在任何地方都不可見?

問題634559還顯示了一個沒有任何「繼承UserControl」語句的InteropUserControl類聲明。我必須從我的VB.Net知識中錯過一些簡單的東西。 (我在C#中完成了大部分.Net工作。)

任何幫助理解這一點,將不勝感激。

回答

0

我相信< ComClass()>充當編譯器添加一些接口的信號。

I've found one source for that behavior.

這有可能是一個類似的重寫繼承在這種情況下發生。

+0

我讀了引用的文章,雖然該信息是有趣和相關到什麼我在做,沒有任何東西表明屬性可以改變屬性存在的類的基類。 我仍然想知道一個類定義如何能夠包含一個「繼承」子句,但系統仍然神祕地計算出基類。 – 2010-01-07 03:46:35

+0

顯然有一些重寫正在某處添加一個繼承子句,即使它從不出現在源代碼中。文章表明,即使確切的行爲(添加'Implements'子句)與您的情況有所不同,這種對屬性做出響應的行爲並非前所未有的。 – 2010-01-07 05:02:06

+0

「重寫」完全是*所有屬性所做的,因爲它們改變爲生成的代碼/ IL。 – RBarryYoung 2010-01-22 17:39:20

0

VB.Net編譯器自動添加Inherits UserControl。看看你的班級使用Reflector來看看這個。除此之外,它還添加了Implements _InteropUserControl。所以,當你寫你的類是這樣的:

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

    ... 

它會出來找這樣的事情在反射器:

<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 

    ... 
+0

我可以說這是在封面下發生的。我想回答的問題是,是什麼讓VB.Net編譯器做到這一點?看起來奇怪的是,新類應該從UserControl下降(並實現_InteropUserControl)似乎是完全不可見的。 – 2010-01-28 22:37:39

+0

你是什麼意思?該屬性本身告訴編譯器添加它。就像寫公共類告訴編譯器一樣,屬性也告訴編譯器。 – 2010-01-29 03:41:13