ILSpy,如何解决依赖关系?

Ste*_*ger 6 .net c# reflection decompiler ilspy

我想用ILSpy反汇编整个.NET程序集.

我使用此代码作为基础:http:
//skysigal.xact-solutions.com/Blog/tabid/427/entryid/2488/Default.aspx

它工作正常,就像我有一个引用Npgsql.dll(或任何其他非gac程序集)的程序集,然后我得到AssemblyResolutionException.

无法解析程序集:'Npgsql,Version = 2.0.11.92,Culture = neutral,PublicKeyToken = 5d8b90d52f46fda7'

我知道如何获得引用的程序集,但是如何将它们添加到ast?

    // SqlWebAdmin.Models.Decompiler.DecompileAssembly("xy.dll");
    public static string DecompileAssembly(string pathToAssembly)
    {
        //Assembly assembly = Assembly.LoadFrom(pathToAssembly);
        System.Reflection.Assembly assembly = System.Reflection.Assembly.ReflectionOnlyLoadFrom(pathToAssembly);
        //assembly.GetReferencedAssemblies();

        //assembly.GetReferencedAssemblies(assembly);
        Mono.Cecil.AssemblyDefinition assemblyDefinition =
            Mono.Cecil.AssemblyDefinition.ReadAssembly(pathToAssembly);



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


        //new Helpers.RemoveCompilerAttribute().Run(decompiler.CompilationUnit);
        using (System.IO.StringWriter output = new System.IO.StringWriter())
        {
            astBuilder.GenerateCode(new ICSharpCode.Decompiler.PlainTextOutput(output));
            string result = output.ToString();
            return result;
        }

        return "";
    } // End Function DecompileAssembly
Run Code Online (Sandbox Code Playgroud)

Jb *_*ain 13

您需要告诉Cecil,ILSpy正在使用的基础元数据读取器,程序集所在的位置.你可以写:

var resolver = new DefaultAssemblyResolver();
resolver.AddSearchDirectory("path/to/my/assemblies");

var parameters = new ReaderParameters
{
    AssemblyResolver = resolver,
};

var assembly = AssemblyDefinition.ReadAssembly(pathToAssembly, parameters);
Run Code Online (Sandbox Code Playgroud)

这是告诉Cecil在何处解析引用程序集的最自然方式.这样,您可以使用System.Reflection删除加载程序集的行,并仅使用ILSpy堆栈.