【问题标题】:how to read the assembly manifest without loading the .dll如何在不加载 .dll 的情况下读取程序集清单
【发布时间】:2009-07-31 14:19:53
【问题描述】:

基本上需要在不加载程序集本身的情况下以编程方式读取依赖项,因为那样你就无法卸载它们

【问题讨论】:

    标签: c# .net reflection clr


    【解决方案1】:

    找到这个 System.Reflection.Assembly.ReflectionOnlyLoadFrom(路径) 成功了

    【讨论】:

      【解决方案2】:

      我想到了 2 个解决方案,尽管我认为有更简单的方法(我忘记了或不知道 :)):
      1. 使用您可以创建的一些额外的AppDomain 加载您的程序集。卸载整个 AddDomain 也将卸载已加载的程序集(但仅限于使用此 AppDomain 加载的程序集)。
      2. 使用一些 api,例如CCI,它允许您查看托管 dll 的内部,而无需使用反射机制加载它。

      【讨论】:

      • thx,将查看 cci,由于依赖关系,第一个选项不起作用
      • 看着它却无处可去...我找到的唯一样本是codeproject.com/KB/recipes/Not_Used_Analysis.aspx,但它很旧并且无法编译
      • 我得到了它与 Cecil 的合作,但我想使用 CCI,因为它由 MS 内部使用并且可能会更新
      • codeplex 上有 3 个与 CCI 相关的项目,每个项目都有自己的示例(范围从检查一些资源到迷你编译器),它们相当难以理解(我认为作者知道这一事实,即他们需要介绍一些关于这个的教程:) ),但你可以查看这些。就个人而言,我有兴趣将我的编译器(基于反射)重写为 CCI,但我正在等待有关库(教程、书籍?)的更多信息。
      【解决方案3】:

      库马尔,

      您可以卸载 .Net DLL,但您必须首先使用 AppDomain 对象加载它们,然后再卸载。

      看一看:http://msdn.microsoft.com/en-us/library/system.appdomain(VS.80).aspx

      如果您仍然想避免这种类型的过程,我想您可以自己解析 DLL,但这比我认为使用 AppDomain 的工作要多得多。

      -p

      【讨论】:

      • 问题以某种方式解决了新 AppDomain 沙箱中 dll 的依赖关系,sandBox.AssemblyResolve += new ResolveEventHandler(reh) 生成一个错误,提示找不到当前程序集???有什么线索吗?
      【解决方案4】:

      希望你期待 Ildasm.exe(中间语言反汇编程序)

      http://msdn.microsoft.com/en-us/library/aa309387(VS.71).aspx

      【讨论】:

        【解决方案5】:

        如果我错了,我相信有人会纠正我,但清单不只是 DLL 中的另一个资源吗?如果是这样,您可以像阅读任何其他资源一样阅读它。

        这是一个开源工具,可让您探索 DLL 资源:

        http://www.wilsonc.demon.co.uk/d10resourceeditor.htm
        

        果然,我可以看到嵌入的清单。

        因此,使用 LoadLibrary() 加载 DLL 并进行资源搜索。

        【讨论】:

        • LoadLibrary() 不适用于我之前似乎读过的托管 dll
        【解决方案6】:

        使用 DnSpy(它不会在您的程序中加载 dll):

                var assemblyDef = dnlib.DotNet.AssemblyDef.Load("myDllName.dll");
                var manifest = assemblyDef.ManifestModule; // do whatever you want from here
        

        参考:https://www.nuget.org/packages/dnSpyLibs

        我为此写了一篇博文:https://medium.com/angular-and-dot-net/reading-assembly-info-without-loading-it-in-c-31a4bea7ef73

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多