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

Get list of loaded Assemblies on UAP10 platform

在 "normal" 面向 .NET Framework 4 的 .NET 程序集上,我可以使用 AppDomain.CurrentDomain.GetAssemblies() 获取所有已加载程序集的列表。

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

How to do this on a Windows Universal App or on a CoreCLR application?

不,你不能。与Full.NET相比,.NET for UWP只提供了有限级别的反射函数。 在.NET for UWP中,您只能通过以下代码获取程序集信息。

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

一种做你想做的事情的方法是获取位于你的应用程序安装文件夹中的 DLLs/assemblies(在某些情况下可以假设在 used/loaded你的应用程序)。

    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
}

感谢 this reddit thread/user

在我们的例子中,我们可以使用 .NET Standard 中的 AppDomain.CurrentDomain.GetAssemblies()

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

我喜欢 "smart" 编译器 :)