簡體   English   中英

WinRT中的動態負載裝配

[英]Dynamic load assembly in WinRT

我創建了一個程序,使用以下代碼加載動態程序集:

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

我在Internet上閱讀的所有內容都表明,Microsoft已使其成為運行時環境(WinRT和UWP)的故意安全功能,無法在運行時加載程序集。 這是UWP中的節目停止限制功能。 它或多或少使平台無用,因為如果給定客戶進行了自定義,則應用程序供應商將不得不拆分應用程序並將其版本部署到每個客戶的商店中。

請花點時間對該功能請求進行投票,以允許在運行時動態加載程序集: https : //wpdev.uservoice.com/forums/110705-universal-windows-platform/suggestions/18145291-dynamically-load-assembly

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM