Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #66, МАЙ 2006 г.

.NET секретам

 

Спецвыпуск: Хакер, номер #066, стр. 066-058-5


Dim str As String = ep.GetText(code.EndPoint)

ParseCode(CType(code, CodeNamespace).Members)

Next

Next

End Sub

Sub ParseCode(ByVal elem As CodeElements)

For i As Integer = 1 To elem.Count

Dim code As CodeElement = elem.Item(i)

If code.IsCodeType() Then

End If

Dim ep As EditPoint = code.StartPoint.CreateEditPoint()

Dim str As String = ep.GetText(code.EndPoint)

If TypeOf code Is CodeClass Or _

TypeOf code Is CodeStruct Or _

TypeOf code Is CodeInterface Then

ParseCode(CType(code, CodeType).Members)

ElseIf TypeOf code Is CodeFunction Then

ParseParameters(CType(code, CodeFunction).Parameters)

End If

Next

End Sub

Sub ParseParameters(ByVal elem As CodeElements)

For i As Integer = 1 To elem.Count

Dim code As CodeParameter = elem.Item(i)

Dim ep As EditPoint = code.StartPoint.CreateEditPoint()

Dim str As String = ep.GetText(code.EndPoint)

If str.Split(" ".ToCharArray()).Length < 2 Then

ep.WordRight()

ep.Insert(" __Param" + i.ToString())

End If

Next

End Sub

Function ListProj() As ArrayList

Dim list As New ArrayList

Dim proj As Project = DTE.ActiveSolutionProjects(0)

Dim win As Window = DTE.Windows.Item(Constants.vsWindowKindCommandWindow)

listProjAux(proj.ProjectItems(), list)

Return list

End Function

Sub ListProjAux(ByVal projitems As ProjectItems, ByVal list As ArrayList)

For Each projitem As ProjectItem In projitems

If GetExt(projitem) = "cs" Then list.Add(projitem)

If Not projitem.ProjectItems Is Nothing Then

ListProjAux(projitem.ProjectItems, list)

End If

Next

End Sub

Function GetExt(ByVal pi As ProjectItem) As String

Dim str() As String = pi.Name.Split(".".ToCharArray())

Return str(str.Length - 1)

End Function

End Module

Чтобы вставить этот макрос, воспользуемся меню Tools> Macros> Macro IDE. Никогда раньше я не писал макросы для Studio, поэтому не удивляйся, что макрос написан на vb .net — это язык по умолчанию для Macro.

Собственно, запустив макрос, спокойно уходи попить кофе — успеешь к моменту, когда он закончит свою работу (макрос вставляет названия параметров в формате " __Param" + NumberOfItemParameter). Итак, часть проблем решена, но…

[на смену приходят] более коварные ошибки. Дело в том, что в il-коде допускаются методы, которые могут быть похожи количеством и одинаковыми типами параметров, но их различие должно заключаться в типе возвращаемого значения. Таких ошибок в коде не меньше, чем из описанных выше типов. Их решают опять же с помощью макроса.

Как и в предыдущем примере, остаются только две ошибки, связанные с присутствием двух классов в пространстве имен ("-"). Их названия — это a и b. Члены этих классов не используются в проекте, поэтому просто исключаем их из проекта или удаляем. Наконец-то все ошибки компиляции побеждены. Берем пример, поставляемый с данным компонентом, запускаем его и наблюдаем за тем, что все работает без ошибок.

[работоспособные исходники] были восстановлены всего за час. На написание их ушло бы не менее двух месяцев. Какой-нибудь злой программист наверняка включил бы этот исходный код непосредственно в свой проект и обфусцировал бы его. Не найдется никого, кто был бы в состоянии доказать, что «не я» написал эту часть программы ;)

Назад на стр. 066-058-4  Содержание