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

6

需要以编程方式读取依赖项,而不加载程序集本身,因为这样就无法卸载它们。

6个回答

8

我发现使用 System.Reflection.Assembly.ReflectionOnlyLoadFrom(path) 可以解决这个问题。


3
我想到了两种解决方案,虽然我认为还有更简单的方法(但我忘记或不知道是什么 :)):
1. 使用一些额外的AppDomain来加载你的程序集。卸载整个AddDomain也将卸载已加载的程序集(但仅限于使用此AppDomain加载的那些程序集)。
2. 使用一些API,例如CCI,它允许您在不使用反射机制加载它的情况下查看托管dll中的内容。

谢谢,我会研究CCI,第一个选项由于依赖关系无法使用。 - Kumar
看着它却一事无成...我找到的唯一示例是http://www.codeproject.com/KB/recipes/Not_Used_Analysis.aspx,但它已经过时且不能编译。 - Kumar
我已经使用Cecil使其工作,但我想使用CCI,因为它是由微软内部使用的,可能更加更新。 - Kumar
在CodePlex上有3个与CCI相关的项目,每个项目都有自己的示例(从检查某些资源到迷你编译器),它们相当难以理解(我认为作者们意识到他们需要介绍一些关于这个的教程:)),但您可以检查这些内容。就我个人而言,我有兴趣将我的编译器(基于反射)重写为CCI,但我正在等待有关库的更多信息(教程,书籍?)。 - Marcin Deptuła

2

问题在于解决新AppDomain沙箱中dll的依赖关系,但是一些方式下,sandBox.AssemblyResolve += new ResolveEventHandler(reh) 会生成一个错误,指出当前程序集未找到。有什么线索吗? - Kumar

1

0

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

这里有一个开源工具,可以让您探索DLL的资源:

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

果然,我可以使用它查看嵌入式清单。

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


从我之前阅读的内容来看,LoadLibrary() 无法与托管 DLL 正常工作。 - Kumar

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接