如何获取.NET Compact Framework中所有已加载程序集(引用)的编程列表

时间:2009-06-02 17:39:40

标签: c# .net compact-framework assemblies windows-ce

我在Windows CE上运行并使用Compact Framework。我需要获取我的应用程序已加载的所有引用程序集的列表。能够访问这些程序集的AssemblyName(对象)会很高兴。

一个例子就像通过执行以下操作来获取正在运行的程序集:Assembly.GetExecutingAssembly();除了我需要获得所有其他加载程序集(第三方Dll)的引用。

完整框架具有Assembly.GetExecutingAssembly().GetReferencedAssemblies()方法,但它在Compact Framework上不可用。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:5)

基于this,似乎托管dll在传统框架中并非真正“加载”。相反,IL是内存映射的,JIT只是抓住了它所需要的东西(节省了必须为已经执行但不再使用的代码维护内存负载)

这可以解释为什么CF无法迭代加载的dll。至于为什么它不允许迭代引用的dll ,这是一个完全兼容的时间构造......

作为可能的解决方法:
使用GetExecutingAssembly获取活动代码。确保在您的可执行文件中发生这种情况,以便它获得根组件。

编写一些能够解析清单的dll的代码,指出哪些程序集被引用(这不需要是托管代码 - 微软提供的非托管内省API甚至可以为您执行此操作,并且dll格式规范既公开又不太可能在不久的将来彻底改变)。我建议从GAC加载黑名单dll(虽然这可能是不必要的)。

答案 1 :(得分:0)

我想如果没有API可以做到这一点,你可以尝试一下......

请记住,这不是一个很好的方法......

  1. 在Windows CE中查找PInvoke调用并调用它们以确定该进程加载了哪些dll。

  2. 然后遍历dll以检查它们是否具有CLI标头。或者您可以尝试将dll作为程序集加载,如果它加载则它是由应用程序加载的.NET程序集。

  3. 我知道这不是一种正确的方法,但这可能有用。