c# - ILSpy,如何解决依赖关系?

标签 c# .net 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

最佳答案

您需要告诉 Cecil,ILSpy 使用的底层元数据读取器,您的程序集在哪里。你可以这样写:

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

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

var assembly = AssemblyDefinition.ReadAssembly(pathToAssembly, parameters);

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

关于c# - ILSpy,如何解决依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8689505/

相关文章:

reflection - TypeScript:在运行时获取类名?

Java方法用Reflection给对象字段赋值

c# - 使用 Mailkit 丢失附件

c# - 防止无效的文本框输入绑定(bind)到业务对象属性?

c# - 在 EPPlus 中编写 Excel 文件

c# - 用C#改变单元格的背景

.net - ASP.NET Core 3.0 端点路由和自定义中间件

java - Field#getAnnotation() 不适用于自己的注释

c# - 我找不到 : System. 事务命名空间

c# - 如何快速有效地从 'simple' 截图中读取文本?