Пример динамической загрузки сборки из каталога пакета 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. Вы должны сохранить список имен сборок где-нибудь (в простом файле внутри Assets) и вызывать 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.
// ...
}