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

本文关键字:程序集 列表 加载 UAP10 平台 获取 | 更新日期: 2023-09-27 18:12:12

在针对。net Framework 4的"正常" . net程序集上,我可以使用AppDomain.CurrentDomain.GetAssemblies()来获取所有加载程序集的列表。

如何在Windows通用应用程序或CoreCLR应用程序上做到这一点?

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

你想要做的一种方法是获得位于你的应用程序安装文件夹中的dll/程序集(可以假设在某些情况下正在使用/加载在你的应用程序中)。

    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线程/用户。

如何在Windows通用应用程序或CoreCLR应用程序上做到这一点?

不,你不能。与完人相比。针对UWP的。NET只提供了有限级别的反射函数。在。net for UWP中,您只能通过使用下面的代码来获取程序集信息。

var assembly = this.GetType().GetTypeInfo().Assembly;

在我们的例子中,我们可以使用。net标准中的AppDomain.CurrentDomain.GetAssemblies()

唯一的问题是,如果没有对项目的直接代码引用,即使有项目引用,它也不会找到程序集。这就是我们的情况,因为我们使用MEF来做事情。为了解决这个问题,我们只需要设置一个虚拟代码引用。

我喜欢"智能"编译器:)