【发布时间】:2015-09-09 18:50:57
【问题描述】:
在面向 .NET Framework 4 的“普通”.NET 程序集上,我可以使用 AppDomain.CurrentDomain.GetAssemblies() 获取所有已加载程序集的列表。
如何在 Windows 通用应用程序或 CoreCLR 应用程序上执行此操作?
【问题讨论】:
标签: c# win-universal-app coreclr
在面向 .NET Framework 4 的“普通”.NET 程序集上,我可以使用 AppDomain.CurrentDomain.GetAssemblies() 获取所有已加载程序集的列表。
如何在 Windows 通用应用程序或 CoreCLR 应用程序上执行此操作?
【问题讨论】:
标签: c# win-universal-app coreclr
一种做你想做的事情的方法是获取位于你的应用安装文件夹中的 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
}
【讨论】:
如何在 Windows 通用应用程序或 CoreCLR 应用程序上执行此操作?
不,你不能。与Full.NET 相比,.NET for UWP 仅提供有限级别的反射功能。 在 .NET for UWP 中,您只能使用以下代码获取程序集信息。
var assembly = this.GetType().GetTypeInfo().Assembly;
【讨论】:
在我们的例子中,我们可以使用 .NET Standard 中的AppDomain.CurrentDomain.GetAssemblies()。
唯一的问题是,如果没有对项目的直接代码引用,即使有项目引用,它也不会找到程序集。我们就是这种情况,因为我们使用 MEF 来做事。为了解决这个问题,我们只需设置一个虚拟代码引用。
我喜欢“智能”编译器 :)
【讨论】: