获取在UAP10平台上加载的程序集列表。

4

在针对.NET Framework 4的“普通” .NET程序集中,我可以使用AppDomain.CurrentDomain.GetAssemblies()来获取所有已加载程序集的列表。

如何在Windows通用应用程序或CoreCLR应用程序上执行此操作?

3个回答

5

要达到您想要的效果,一种方法是获取位于应用程序安装文件夹中的DLLs/程序集(可以假设在某些情况下正在您的应用程序中使用/加载)。

    public static async Task<List<Assembly>> GetAssemblyList()
    {
        List<Assembly> assemblies = new List<Assembly>();

        var files = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFilesAsync();
        if (files == null)
            return assemblies;

        foreach (var file in files.Where(file => file.FileType == ".dll" || file.FileType == ".exe"))
        {
            try
            {
                assemblies.Add(Assembly.Load(new AssemblyName(file.DisplayName)));
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }

        }

        return assemblies;
     }

那么要遍历它们,您可以执行以下操作:
foreach (var assembly in GetAssemblyList().Result)
{
   //Do something with it
}

感谢这个Reddit主题帖/用户


比较在Debug和Release模式下的输出,看看是否得到了你期望的所有信息。 - jchristof
请注意,您可能无法找到所有寻找的dll。这取决于“.NET Native Compiler”决定变得多么“智能”。如果没有任何直接的代码引用,它将丢弃dll(我们正在使用MEF)。 - James Esh

4
如何在Windows通用应用程序或CoreCLR应用程序中进行此操作? 不可以。与完整的.NET相比,.NET for UWP仅提供有限级别的反射功能。 在.NET for UWP中,您只能使用以下代码获取程序集信息。
var assembly = this.GetType().GetTypeInfo().Assembly;

有没有任何资源可以明确说明哪些API可用于UWP?即使从PCL或UWP反射API的参考开始,一旦我点击命名空间的其余部分,就会跳转到普通的.NET类。无预警地遇到障碍非常令人沮丧。 - Berin Loritsch

0
在我们的情况下,我们可以使用.NET Standard中的AppDomain.CurrentDomain.GetAssemblies()
唯一的问题是,如果没有直接的代码引用到项目,它将无法找到程序集,即使有项目引用。这就是我们的情况,因为我们使用MEF来完成某些任务。为了解决这个问题,我们只需设置一个虚拟的代码引用即可。
我喜欢“智能”编译器 :)

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