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