我在Windows CE上运行并使用Compact Framework。我需要获取我的应用程序已加载的所有引用程序集的列表。能够访问这些程序集的AssemblyName(对象)会很高兴。
一个例子就像通过执行以下操作来获取正在运行的程序集:Assembly.GetExecutingAssembly();除了我需要获得所有其他加载程序集(第三方Dll)的引用。
完整框架具有Assembly.GetExecutingAssembly().GetReferencedAssemblies()方法,但它在Compact Framework上不可用。任何帮助将不胜感激。
答案 0 :(得分:5)
基于this,似乎托管dll在传统框架中并非真正“加载”。相反,IL是内存映射的,JIT只是抓住了它所需要的东西(节省了必须为已经执行但不再使用的代码维护内存负载)
这可以解释为什么CF无法迭代加载的dll。至于为什么它不允许迭代引用的dll ,这是一个完全兼容的时间构造......
作为可能的解决方法:
使用GetExecutingAssembly获取活动代码。确保在您的可执行文件中发生这种情况,以便它获得根组件。
编写一些能够解析清单的dll的代码,指出哪些程序集被引用(这不需要是托管代码 - 微软提供的非托管内省API甚至可以为您执行此操作,并且dll格式规范既公开又不太可能在不久的将来彻底改变)。我建议从GAC加载黑名单dll(虽然这可能是不必要的)。
答案 1 :(得分:0)
我想如果没有API可以做到这一点,你可以尝试一下......
请记住,这不是一个很好的方法......
在Windows CE中查找PInvoke调用并调用它们以确定该进程加载了哪些dll。
然后遍历dll以检查它们是否具有CLI标头。或者您可以尝试将dll作为程序集加载,如果它加载则它是由应用程序加载的.NET程序集。
我知道这不是一种正确的方法,但这可能有用。