2012-11-23 3 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

해결책을 직접 찾았습니다. AssemblyResolutionException을 캐치하고 누락 된 참조 어셈블리에 대해 null을 반환하는 자체 AssemblyResolver를 만들었습니다.

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

관련 문제