从 AppX 包目录(来自MSDN 论坛)加载动态程序集的示例:
private async Task<IEnumerable<Assembly>> GetAssemblyListAsync()
{
var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
List<Assembly> assemblies = new List<Assembly>();
foreach (StorageFile file in await folder.GetFilesAsync())
{
if (file.FileType == ".dll" || file.FileType == ".exe")
{
var name = file.Name.Substring(0, file.Name.Length - file.FileType.Length);
Assembly assembly = Assembly.Load(new AssemblyName() { Name = name });
assemblies.Add(assembly);
}
}
return assemblies;
}
程序集必须添加到应用程序包中。您不能从外部来源下载它们。
但是,这种方法在 .NET Native 中不起作用,因为所有内容都合并到一个 DLL 中。您应该将程序集名称列表保存在某处(在资产内的一个简单文件中)并Assembly.Load
为每个项目调用。
调试模式下的动态程序集列表示例和发布模式下的预定义程序集名称数组(.NET Native 工具链)。
#if DEBUG
using Windows.Storage;
#endif
// ...
IEnumerable<string> assemblyNames;
#if DEBUG
assemblyNames = Windows.ApplicationModel.Package.Current.InstalledLocation.GetFilesAsync().AsTask().Result
.Where(file => file.FileType == ".dll" && file.Name.Contains("Business"))
.Select(file => file.Name.Substring(0, file.Name.Length - file.FileType.Length));
#else
assemblyNames = new[] { "California.Business", "Colorado.Business" };
#endif
foreach (var name in assemblyNames)
{
var assembly = Assembly.Load(new AssemblyName() { Name = name });
// Load required types.
// ...
}