Does WinRT under windows 8 metro allow you to dynamically load and execute code? For example, is it possible to download a dll into memory or to isolated storage and run cod
You question is a bit unclear... so some general pointers:
.NET app using among other things WinRT (but NOT the new UI model!)
In this case everything is possible that you today (perhaps not OLEDB) but Reflection etc.
.NET app built for Metro UI
AFAIK this is not possible (see http://blogs.microsoft.co.il/blogs/sasha/archive/2011/09/17/metro-net-framework-profile-windows-tailored.aspx and http://tirania.org/blog/) at least as long as you want to sell via Windows Store... outside of this scope (Windows Store) there might some tricks to circumvent that restriction as already demonstrated by some... but I wouldn't count on that... MAYBE you can use some JavaScript (eval
etc.) to do something dynamic but I am not sure currently
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.
// ...
}
Actually, Metro style apps CAN dynamically load and execute code. There are some restrictions; Metro and Desktop apps work a bit differently in key ways.
The mechanisms vary a bit, depending on the caller (LoadPackagedLibrary() Assembly.Load(), etc). One key difference between Metro and Desktop - Metro apps can only dynamically load what's in your app's package graph (your package and s) and system code (that could be otherwise loaded statically).
See my post for some more details http://social.msdn.microsoft.com/Forums/en-US/wingameswithdirectx/thread/d1ebe727-2d10-430e-96af-46964dda8225