<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      魔力隨筆.net

      隨心開發,自為滿意

      博客園 首頁 新隨筆 聯系 訂閱 管理

      Visual Basic一大吸引人的地方是它支持直接的后期綁定。就是說可以直接在代碼里訪問那些要到運行時才能確定的對象成員。比如這樣一段代碼:

       

      1Dim f As Object = New Form2()
      2f.Show()

       

      Object是沒有Show方法的,但是這段代碼可以正確運行。這個功能讓VB有了很強的靈活性,它能夠直接操作沒有類型庫的COM對象,而C#則很麻煩。在COM時代,VB的后期綁定是通過IDispatch實現的,而.NET時代,它是由Reflection實現的。為了揭開VB后期綁定的秘密,后面幾篇就來討論一下后期綁定的實現原理。

      首先,對方法的調用是后期綁定最重要的一個環節,因為實現了后期綁定的方法調用,就能實現對屬性的訪問和對事件的操作,這基本上就是對象操作的全部內容。VB的編譯器在發現后期綁定的調用后,會用Microsoft.VisualBasic.CompilerServices中的相關操作類實現后期綁定的方法調用。其中,LateBinding.InternalLateCall是這個操作的橋梁。我們來看看這個方法的實現。

      這段代碼是我從IL手工翻譯來的,因為流行的反編譯器都不能正確反編譯VB的When語句。這段代碼很可能有錯,湊合著看吧:


       

       1<DebuggerStepThrough(), _
       2
       3DebuggerHidden()> _
       4
       5Friend Function InternalLateCall( _
       6
       7    ByVal o As Object, _
       8
       9    ByVal objType As System.Type, _
      10
      11    ByVal name As String, _
      12
      13    ByVal args() As Object, _
      14
      15    ByVal paramnames() As String, _
      16
      17    ByVal CopyBack() As Boolean, _
      18
      19    ByVal IgnoreReturn As Boolean _
      20
      21As Object
      22
      23

       

          '以下變量的名字已經被我安我的理解改變過

       

         

        1 Dim binder As Microsoft.VisualBasic.CompilerServices.VBBinder
        2
        3    Dim flags As System.Reflection.BindingFlags
        4
        5    Dim result As Object
        6
        7    Dim correctIReflect As System.Reflection.IReflect
        8
        9    Dim members() As System.Reflection.MemberInfo
       10
       11    Dim argNumber As Integer
       12
       13    Dim firstMember As System.Reflection.MemberInfo
       14
       15    Dim firstMethodBase As System.Reflection.MethodBase
       16
       17    Dim params() As System.Reflection.ParameterInfo
       18
       19    Dim paramsNumber As Integer
       20
       21    Dim paramsInfo As System.Reflection.ParameterInfo
       22
       23    Dim paramsAttr() As Object
       24
       25 
       26
       27    If IgnoreReturn Then
       28
       29        flags = &H4015D Or &H1000000
       30
       31    Else
       32
       33        flags = &H4015D
       34
       35    End If
       36
       37 
       38
       39    If objType Is Nothing Then
       40
       41        If o Is Nothing Then
       42
       43            Throw ExceptionUtils.VbMakeException(91)
       44
       45        Else
       46
       47            objType = o.GetType()
       48
       49        End If
       50
       51    End If
       52
       53 
       54
       55    correctIReflect = LateBinding.GetCorrectIReflect(o, objType)
       56
       57 
       58
       59    If objType.IsCOMObject Then
       60
       61        LateBinding.CheckForClassExtendingCOMClass(objType)
       62
       63    End If
       64
       65 
       66
       67    If name Is Nothing Then
       68
       69        name = ""
       70
       71    End If
       72
       73 
       74
       75    binder = New VBBinder(CopyBack)
       76
       77 
       78
       79    If Not objType.IsCOMObject() Then
       80
       81        '以下代碼針對非COM對象
       82
       83 
       84
       85        '通過Reflection獲取指定名稱成員
       86
       87        members = _
       88
       89            LateBinding.GetMethodsByName(correctIReflect, name, flags)
       90
       91 
       92
       93        If members Is Nothing OrElse members.Length = 0 Then
       94
       95 
       96
       97            Throw New System.MissingMemberException( _
       98
       99                Utils.GetResourceString( _
      100
      101                "MissingMember_MemberNotFoundOnType2", _
      102
      103                name, _
      104
      105                Utils.VBFriendlyName(objType, o)))
      106
      107 
      108
      109        ElseIf LateBinding.MemberIsField(members) Then
      110
      111 
      112
      113            Throw New System.MissingMemberException( _
      114
      115                Utils.GetResourceString( _
      116
      117                "ExpressionNotProcedure", _
      118
      119                name, _
      120
      121                Utils.VBFriendlyName(objType, o)))
      122
      123 
      124
      125        End If
      126
      127 
      128
      129        If members.Length = 1 Then
      130
      131            'member的長度為1,意味著只有一個重載
      132
      133            '因此下面的代碼針對沒有別名的情況
      134
      135 
      136
      137            firstMember = members(0)
      138
      139            If firstMember.MemberType = 16 Then
      140
      141                '如果該成員是屬性,則繼續獲取“GET”訪問器的信息
      142
      143 
      144
      145                firstMember = _
      146
      147                    CType(firstMember, _
      148
      149                    System.Reflection.PropertyInfo).GetGetMethod()
      150
      151 
      152
      153                If firstMember Is Nothing Then
      154
      155 
      156
      157                    Throw New System.MissingMemberException( _
      158
      159                        Utils.GetResourceString( _
      160
      161                        "MissingMember_MemberNotFoundOnType2", _
      162
      163                        name, _
      164
      165                        Utils.VBFriendlyName(objType, o)))
      166
      167 
      168
      169                End If
      170
      171            End If
      172
      173 
      174
      175            '將成員確定為方法類型,準備調用
      176
      177            firstMethodBase = CType(firstMember, System.Reflection.MethodBase)
      178
      179            params = firstMethodBase.GetParameters()
      180
      181 
      182
      183            argNumber = args.Length
      184
      185            paramsNumber = params.Length
      186
      187 
      188
      189            If argNumber = paramsNumber Then
      190
      191                '沒有任何缺省參數和參數數組的情況
      192
      193 
      194
      195                Return LateBinding.FastCall( _
      196
      197                    o, firstMethodBase, params, _
      198
      199                    args, objType, correctIReflect)
      200
      201            Else
      202
      203                If CopyBack Is Nothing Then
      204
      205                    If LateBinding.NoByrefs(params) Then
      206
      207                        '沒有按引用傳遞的參數
      208
      209                        '判斷最后一個參數是否是參數數組()
      210
      211                        paramsInfo = params(paramsNumber - 1)
      212
      213                        If paramsInfo.ParameterType.IsArray Then
      214
      215                            '通過讀取自定義Attribute來判斷是否參數數組
      216
      217                            paramsAttr = paramsInfo.GetCustomAttributes( _
      218
      219                                GetType(System.ParamArrayAttribute), False)
      220
      221 
      222
      223                            If Not (paramsAttr Is Nothing _
      224
      225                                OrElse paramsAttr.Length = 0Then
      226
      227 
      228
      229                                '沒有參數數組,繼續用FastCall
      230
      231                                Return LateBinding.FastCall( _
      232
      233                                    o, firstMethodBase, params, _
      234
      235                                    args, objType, correctIReflect)
      236
      237                            End If
      238
      239                        Else
      240
      241                            '沒有參數數組,繼續用FastCall
      242
      243                            Return LateBinding.FastCall( _
      244
      245                                o, firstMethodBase, params, _
      246
      247                                args, objType, correctIReflect)
      248
      249                        End If
      250
      251                    End If
      252
      253                End If
      254
      255            End If
      256
      257        End If
      258
      259    End If
      260
      261 
      262
      263    'COM對象、有參數數組、有方法別名或者有ByRef參數需要回送值的情況
      264
      265    Try
      266
      267        '用VBBinder來進行所需的處理
      268
      269        result = binder.InvokeMember( _
      270
      271            name, flags, objType, correctIReflect, o, _
      272
      273            args, NothingNothing, paramnames)
      274
      275 
      276
      277        Exit Try
      278
      279    Catch misMember As System.MissingMemberException
      280
      281 
      282
      283        Throw misMember
      284
      285 
      286
      287    Catch ex As System.Exception When _
      288
      289        LateBinding.IsMissingMemberException(ex)
      290
      291 
      292
      293        Throw New System.MissingMemberException( _
      294
      295            Utils.GetResourceString( _
      296
      297            "MissingMember_MemberNotFoundOnType2", _
      298
      299            name, _
      300
      301            Utils.VBFriendlyName(objType, o)))
      302
      303 
      304
      305    Catch targetInv As _
      306
      307        System.Reflection.TargetInvocationException
      308
      309 
      310
      311        Throw targetInv.InnerException
      312
      313 
      314
      315    End Try
      316
      317 
      318
      319    Return result
      320
      321 
      322
      323End Function
      324
      325

      關鍵部分我加了少量注釋??偟膩碚f,這段代碼首先分解了傳遞的參數,通過反射從對象的類型中查找所需的方法。在調用的時候,它建立了一個VBBinder類的對象,VBBinder繼承自System.Reflection.Binder類,是一個管理實參和型參結合的類。除了用VBBinder調用以外,我們還能看出,如果符合下列情況,將通過另一個方法LateBinding.FastCall來調用方法:

      1、不是COM對象的方法

      2、方法沒有別名(沒有重載)

      3、沒有使用參數數組和可選參數

      4、沒有按引用傳遞和接受返回參數的情況

      FastCall運行速度可能要比VBBinder.InvokeMember快,它忽略別名和其它高級的用法。

      關于VBBinder和LateBinding的具體實現,我們下次繼續討論。


      以上為轉載!沒有經過作者的允許。特此聲明!

      posted on 2005-08-14 22:25  魔力隨筆.net  閱讀(1977)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 久久综合色之久久综合色| 国产一区二区三区导航| 精品一区二区不卡无码AV| 国产在线线精品宅男网址| 国产高清色高清在线观看| 高清国产av一区二区三区| 国产大陆av一区二区三区| 国产熟女老阿姨毛片看爽爽| 狠狠躁夜夜躁无码中文字幕| 国产免费无遮挡吸奶头视频| 国产精品无码aⅴ嫩草| 61精品人妻一区二区三区| 久久精品国产99国产精品严洲| 国产明星精品无码AV换脸| 亚洲欧洲日韩国内精品| 亚洲欧洲日韩国内高清| JIZZJIZZ国产| 国产精品午夜福利91| 亚洲一品道一区二区三区| 丰满少妇人妻久久久久久| 国产在线国偷精品产拍| 一本加勒比hezyo无码专区| 热久久美女精品天天吊色| 丰城市| 高清日韩一区二区三区视频| 双乳奶水饱满少妇呻吟免费看| 午夜久久一区二区狠狠干| 老师扒下内裤让我爽了一夜| 四虎成人在线观看免费| 青青草无码免费一二三区| 99精品久久久中文字幕| 国产黄色精品一区二区三区| 全免费A级毛片免费看无码| 无码伊人久久大杳蕉中文无码| 香蕉久久精品日日躁夜夜躁夏| 国内熟女中文字幕第一页| 双柏县| 久久精品女人的天堂av| 亚洲国产精品成人无码区| 国产成人精品无码播放| 日韩黄色av一区二区三区|