如何在不加载.dll的情况下读取程序集清单

时间:2009-07-31 14:19:53

标签: c# .net reflection clr

基本上需要以编程方式读取依赖项而不加载程序集本身,因为那时你无法卸载它们

6 个答案:

答案 0 :(得分:7)

发现了这个 System.Reflection.Assembly.ReflectionOnlyLoadFrom(路径) 诀窍

答案 1 :(得分:2)

库马尔

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

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

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

-p

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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

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

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

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

答案 5 :(得分:0)

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

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

ref:https://www.nuget.org/packages/dnSpyLibs

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