2015-04-02 52 views
3

我有舊式客戶端,他們使用智能掃描儀和舊版Windows Mobile。因此,我堅持在這些智能設備的緊湊框架中開發。我正在編寫一個類庫,它將爲掃描器硬件的接口提供插件類型機制。我希望能夠將來自掃描儀制造商的第三方程序集作爲嵌入式資源嵌入到插件DLL中。我想這樣做是爲了避免在我的插件系統試圖查找插件接口的實現時不得不反思所有這些第三方DLL。相當海峽向前。問題是,使用嵌入式資源,我可以獲得程序集的字節,但在緊湊框架中不提供System.Reflection.Assembly.LoadAssembly(byte[])。只有LoadAssembly(AssemblyName)LoadAssembly(String)。我如何在運行時從嵌入式資源加載這些程序集?如何從小型框架中的字節數組加載程序集

這是我現在有:

protected void LoadEmbeddedAssemblies() 
    { 
     Assembly asm = Assembly.GetCallingAssembly(); 
     foreach (string resName in asm.GetManifestResourceNames()) 
     { 
      if (resName.EndsWith(".dll")) 
      { 
       try 
       { 
        //this is an embedded assembly 
        using (Stream s = asm.GetManifestResourceStream(resName)) 
        { 
         if (s.Length > Int32.MaxValue) throw new IOException("The assembly is to large"); 
         byte[] bytes = new byte[s.Length];        
         s.Read(bytes, 0, Convert.ToInt32(s.Length)); 

         //Assembly.Load(bytes) <- Compact Framework sucks 
        } 
       } 
       catch (Exception e) 
       { 
        Log(new LogMessageRaisedEventArgs("AScannerBase", "LoadEmbeddedAssemblies", "Exception encountered while loading embedded assembly", e.Message)); 
       } 
      } 
     } 
    } 

回答

2

的Compact Framework不支持加載組件的方式。由於應用程序運行的平臺在給定設備上不太可能發生變化,因此只需確定第一次運行的設備類型並將適當的程序集提取到應用程序文件夾中,從此加載程序就會爲您找到它們。

2

由於幾個原因,我不建議將供應商組件嵌入到您的組件中。首先,並非所有設備供應商的SDK都是可以或應該放在應用程序文件夾中的純.NET。許多人需要運行它們的安裝來將標準dll,註冊表項等置於適當的位置。其次,通過將每個供應商程序集嵌入到中間件中來增加組件的大小,並假設您支持多個供應商,則其大小可能會相當大。特別是如果設備已經在GAC中安裝了掃描組件,則您正在使用額外的存儲空間,而您根本不需要這些存儲空間。

我使用,並建議,以下機制:

Application(s)...................................... 
    |            . 
    V            . 
Generic scanning abstraction lib     . (Assembly.LoadFrom based 
    A            . upon convention or XML 
    |            . configuration file) 
Vendor Specific Implementation of abstraction <..... 
    |            
    V            
Vendor SDK 

這樣,你設置你的「插件」在CAB創建時間,包括信息動態加載它們基於一個配置文件或其他命名慣例。該應用程序確實知道或關心抽象的哪個實現被加載,只是它符合抽象。

0

我看到了兩個可能的解決方案,從一個應用程序支持不同的設備:

  1. 你用你的方法和使嵌入設備的需要的組件上,System.Reflection.Assembly.LoadAssembly(字節[] )不受支持,首先將程序集保存到文件系統,然後加載它。這樣你就可以對所有不同的運行時文件進行大量的應用,只需要保存所需的運行時並從文件系統加載/運行。

  2. 您使用像PocketMEF這樣的插件系統,並具有不同的子部件來加載供應商特定的程序集和本機DLL。根據供應商的不同,可以動態加載rumtimes。

在這兩種情況下,您都必須定義接口層並實現實現不同供應商SDK接口的類。

有關如何使用PocketMEF硬件abstracion的文章是在http://www.hjgode.de/wp/2012/02/16/mobile-development-compact-framework-managed-extension-framework-mef/

使用pocketMEF多個接口另一個例子是在https://github.com/hjgode/intermeccontrols/blob/master/DPAG7

而且,cTacke是正確的,大多數.NET組件供應商需要額外的機庫(即Intermec條碼掃描器.NET程序集需要本地DLL itcscan.dll)。有時這些預安裝在windows mobile/CE設備上,有時需要先安裝它們。安裝可能意味着僅複製DLL或(我不知道使用該DLL的供應商),安裝額外的COM接口等,需要在使用之前先註冊。

相關問題