2014-02-20 13 views
2

我從SQL Server中刪除複製,所以我需要搜索錯誤(或自動生成的代碼)讀取列rowguid的代碼。如何在使用Reflection或Mono.Cecil的已編譯程序集中搜索字符串?

爲了防止出現任何問題,我需要在生產服務器上的程序集中搜索以確保所有程序集都已更新。並找到一些我不知道的遺留程序集。

對於使用實體框架的應用程序,我需要使用rowguid名稱查找屬性。但是舊的代碼使用像table [「rowguid」]這樣的代碼。所以我需要找到對該字符串的所有引用。我怎樣才能做到這一點?

我正在使用此代碼。它的工作原理,但效率不高:

foreach (var assemblyFile in allAssemblies) 
{ 
    AssemblyDefinition assemblyDefinition = AssemblyDefinition.ReadAssembly(assemblyFile.FullName, parameters); 

    AstBuilder astBuilder = new AstBuilder(new DecompilerContext(assemblyDefinition.MainModule)); 
    astBuilder.AddAssembly(assemblyDefinition); 

    using (StringWriter output = new StringWriter()) 
    { 
     astBuilder.GenerateCode(new PlainTextOutput(output)); 
     string result = output.ToString(); 
     if (result.IndexOf("rowguid", StringComparison.OrdinalIgnoreCase) > -1) 
     { 
      Console.WriteLine(assemblyFile.FullName + ": "); 
      Console.WriteLine(); 
      Console.WriteLine(result); 
     } 
    } 
} 
+0

如果手動搜索是不夠的,你可以使用工具,如反射器或DotPeek – Lanorkin

+0

我需要搜索組件百元 –

+1

假設程序集未被混淆,可以將程序集反編譯爲源代碼,然後搜索代碼庫。 –

回答

0

我覺得下面的示例代碼將有助於

public static class StringHelper 
{ 
    public static void ReplaceString(string old, string replacement, AssemblyDefinition asm) 
    { 
     foreach (ModuleDefinition mod in asm.Modules) 
     { 
      foreach (TypeDefinition td in mod.Types) 
      { 
       IterateType(td, old, replacement); 
      } 
     } 
    } 
    public static void IterateType(TypeDefinition td, string old, string replacement) 
    { 
     foreach (TypeDefinition ntd in td.NestedTypes) 
     { 
      IterateType(ntd, old, replacement); 
     } 

     foreach (MethodDefinition md in td.Methods) 
     { 
      if (md.HasBody) 
      { 
       for (int i = 0; i < md.Body.Instructions.Count - 1; i++) 
       { 
        Instruction inst = md.Body.Instructions[i]; 
        if (inst.OpCode == OpCodes.Ldstr) 
        { 
         if (inst.Operand.ToString().Equals(old)) 
         { 
          inst.Operand = replacement; 
         } 
        } 
       } 
      } 
     } 
    } 
}