2012-11-23 121 views
2

我想反編譯我的程序集中的一個方法,它引用了例如'Microsoft.SharePoint.dll',但是我沒有在機器上安裝SharePoint。 如果我使用下面的代碼,我得到一個Mono.Cecil.AssemblyResolutionException'未能解析程序集Microsoft.SharePoint ...'。ILSpy AstBuilder中的「無法解析程序集」

AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly("PathToMyAssembly"); 
ICSharpCode.Decompiler.DecompilerContext context = new ICSharpCode.Decompiler.DecompilerContext(assembly.MainModule); 
AstBuilder decompiler = new AstBuilder(context); 
decompiler.AddMethod(method); <!-- here it crashes --> 

使用ILSpy GUI,我可以無誤地加載我的程序集(在沒有SharePoint的同一臺機器上)。

我需要在我的代碼中更改什麼?

回答

4

我自己找到了解決方案。我創建了我自己的AssemblyResolver,它捕獲AssemblyResolutionException併爲缺少的引用程序集返回null。

public class MyDefaultAssemblyResolver : DefaultAssemblyResolver 
{ 
    public override AssemblyDefinition Resolve(AssemblyNameReference name) 
    { 
     try 
     { 
      return base.Resolve(name); 
     } 
     catch { } 
     return null;    
    } 

    public override AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters) 
    { 
     try 
     { 
      return base.Resolve(name, parameters); 
     } 
     catch { } 
     return null; 
    } 

    public override AssemblyDefinition Resolve(string fullName) 
    { 
     try 
     { 
      return base.Resolve(fullName); 
     } 
     catch { } 
     return null; 
    } 

    public override AssemblyDefinition Resolve(string fullName, ReaderParameters parameters) 
    { 
     try 
     { 
      return base.Resolve(fullName, parameters); 
     } 
     catch { } 
     return null; 
    } 
} 

然後,我使用它

var resolver = new MyDefaultAssemblyResolver(); 
resolver.AddSearchDirectory("FolderOfMyAssembly"); 
var parameters = new ReaderParameters 
{ 
    AssemblyResolver = resolver, 
}; 

AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly("PathToMyAssembly", parameters); 

我發現溶液通過調試ILSpy GUI(源代碼是幸運的可用)。

+0

我想你現在可以接受你自己的答案:) – Artemix

相關問題