【发布时间】:2009-07-31 14:19:53
【问题描述】:
基本上需要在不加载程序集本身的情况下以编程方式读取依赖项,因为那样你就无法卸载它们
【问题讨论】:
标签: c# .net reflection clr
基本上需要在不加载程序集本身的情况下以编程方式读取依赖项,因为那样你就无法卸载它们
【问题讨论】:
标签: c# .net reflection clr
找到这个 System.Reflection.Assembly.ReflectionOnlyLoadFrom(路径) 成功了
【讨论】:
我想到了 2 个解决方案,尽管我认为有更简单的方法(我忘记了或不知道 :)):
1. 使用您可以创建的一些额外的AppDomain 加载您的程序集。卸载整个 AddDomain 也将卸载已加载的程序集(但仅限于使用此 AppDomain 加载的程序集)。
2. 使用一些 api,例如CCI,它允许您查看托管 dll 的内部,而无需使用反射机制加载它。
【讨论】:
库马尔,
您可以卸载 .Net DLL,但您必须首先使用 AppDomain 对象加载它们,然后再卸载。
看一看:http://msdn.microsoft.com/en-us/library/system.appdomain(VS.80).aspx
如果您仍然想避免这种类型的过程,我想您可以自己解析 DLL,但这比我认为使用 AppDomain 的工作要多得多。
-p
【讨论】:
希望你期待 Ildasm.exe(中间语言反汇编程序)
http://msdn.microsoft.com/en-us/library/aa309387(VS.71).aspx
【讨论】:
如果我错了,我相信有人会纠正我,但清单不只是 DLL 中的另一个资源吗?如果是这样,您可以像阅读任何其他资源一样阅读它。
这是一个开源工具,可让您探索 DLL 资源:
http://www.wilsonc.demon.co.uk/d10resourceeditor.htm
果然,我可以看到嵌入的清单。
因此,使用 LoadLibrary() 加载 DLL 并进行资源搜索。
【讨论】:
使用 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
【讨论】: