2012-12-25 71 views
0

我创建了一个程序使用下面的代码加载动态组件:动态加载组件

using System; 
using System.Collections.Generic; 
using System.Reflection; 
using System.Threading.Tasks; 

namespace BarcodeReader 
{ 
    public class Parsing 
    { 
     private static string _FolderName = "BarcodeReaders"; 
     private static bool _Initialized = false; 
     private static IEnumerable<IBarcodeReader> _Objs; 

     /// Parse the picture 
     /// <returns>The value from the picture</returns> 
     public static async Task<string> ParsePicture() 
     { 
     // Check if this class has not been initialized, and if it hasn't initialize it 
     if (!_Initialized) 
     { 
      await InitializeAsync(); 
     } 

     foreach (var Obj in _Objs) 
     { 
      if (Obj.IsType()) 
      { 
       return Obj.GetValue(); 
      } 
     } 

     return null; 
     } 

     private static async Task InitializeAsync() 
     { 
     // Get the folder 
     var Folder = await GetFolder(); 

     // Get the Files in the Folder 
     var Files = await Folder.GetFilesAsync(); 

     // Initialize the objects and set them 
     _Objs = InitializeObjects(Files); 

     // Set it as initialized 
     _Initialized = true; 
     } 

     private static IEnumerable<IBarcodeReader> InitializeObjects(IEnumerable<Windows.Storage.StorageFile> Files) 
     { 
     foreach (var File in Files) 
     { 
      string Name = File.Path; 
      var Assembly = System.Reflection.Assembly.Load(new AssemblyName(Name)); 
      foreach (var Typ in Assembly.ExportedTypes) 
      { 
       var TypInfo = Typ.GetTypeInfo(); 
       foreach (var Interf in TypInfo.ImplementedInterfaces) 
       { 
        if (Interf.Name.Equals("IBarcodeReader")) 
        { 
        yield return (IBarcodeReader)Activator.CreateInstance(Typ); 
        } 
       } 
      } 
     } 
     } 

     private static async Task<bool> BarcodeFolderExist(Windows.Storage.StorageFolder Folder) 
     { 
     // Get all folders 
     var Folders = await Folder.GetFoldersAsync(); 

     // For each folder, check if it is the Folder we are searching and if it is return true 
     foreach (var Foldr in Folders) 
     { 
      if (Foldr.Name.Equals(_FolderName)) 
      { 
       return true; 
      } 
     } 

     // Return false as the folder was not found 
     return false; 
     } 

     private static async Task<Windows.Storage.StorageFolder> GetFolder() 
     { 
     // Get the local-folder 
     var Folder = Windows.Storage.ApplicationData.Current.LocalFolder; 

     // Check if the folder does not exist, and if it does not create it 
     if (!await BarcodeFolderExist(Folder)) 
     { 
      await Folder.CreateFolderAsync(_FolderName); 
     } 

     return await Folder.GetFolderAsync(_FolderName); 
     } 
    } 
} 

,我试图加载的项目是这些文件

namespace QRReader 
{ 
    public sealed class QRReader : IBarcodeReader 
    { 
     public bool IsType() 
     { 
     return true; 
     } 

     public string GetValue() 
     { 
     return "HEJ"; 
     } 
    } 

    public interface IBarcodeReader 
    { 
     bool IsType(); 
     string GetValue(); 
    } 
} 

,但我得到这个错误

FileLoadException was unhandled by user code 
The assembly name or code base was illegal. (Exception HRESULT: 0x80131047) 

name -variable设置为 C:\Users\Lasse\AppData\Local\Packages\93e3b2c9-7ef8-4537-be39-d0f3e93ca100_e85ydygyad1dy\LocalState\BarcodeReaders\QRReader.winmd

+0

如果你尝试加载使用反射大会? –

+1

WinRT不允许从任意路径加载程序集。所有可执行文件必须打包在一起,并且必须存储在AppBase文件夹中。否则,这是一个安全且可验证的应用程序的基本功能。因此,动态加载程序集通常很少有意义。 –

+0

@HansPassant我希望,我可以加载它,因为我找到的线程说,自从Assembly.Load方法丢失后我不可能 – The87Boy

回答

0

我在网上看到的一切都表明,微软已经将它作为运行时环境(WinRT和UWP)的故意安全功能,它不可能在运行时加载程序集。这是一个在UWP中停止限制功能的节目。它或多或少地使平台变得没有用处,因为如果对于给定的客户进行定制,应用程序供应商将不得不拆分应用程序并将它的版本部署到每个客户的商店中。

请采取了投票,允许在运行时动态加载组件此功能请求的时间: https://wpdev.uservoice.com/forums/110705-universal-windows-platform/suggestions/18145291-dynamically-load-assembly