Example of dynamic assembly loading from AppX package directory (from MSDN Forums):
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; }
The assemblies must be added to the application package. You can't download them from external source.
However, this approach does not work in .NET Native, because everything is merged into a single DLL. You should save a list of assembly names somewhere (in a simple file inside Assets) and call Assembly.Load for each item.
Example of dynamic assembly listing in debug mode and predefined array of assembly names in release mode (.NET Native tool chain).
#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. // ... }
System.Reflection.Emit, butExpression<T>.Compileis there and seems to be working, so at least some form of runtime code generation is available.