2013-01-24 157 views
1

當它位於資產文件夾中時,是否可以加載dll與Assembly.Load從android_assets文件夾動態加載dll

我有平臺特定的DLL的Windows和Android。我試圖使用Android特定的DLL作爲資產(也在構建動作中),但是當我嘗試將它加載到我的應用程序中時,它沒有找到(我使用了path: file:///android_asset/mydll.dll),而且這隻會發生,如果我將該應用程序構建爲發行版,在調試中我得到加載庫的必要路徑,但不是從資產文件夾。

我該怎麼辦?有另一個地方,我可以把我的DLL從我的應用程序加載?

回答

4

下面是將程序集寫出到Plugins文件夾,然後在運行時讀入和加載的示例。

確保您已將自己的程序集轉至資產文件夾,並將其設置爲AndroidAsset的構建操作。見下面的截圖。

請注意:您可能需要將擴展​​名更改爲.mp3。見here。雖然我沒有這個問題。

enter image description here

一旦你這樣做,你應該能夠通過使用資產管理人獲得的資產。你可以加載它們或者對它們做任何事情。以下是將它們讀入內存並寫出名稱的示例。

const String pluginPath = "Plugins"; 

var pluginAssets = Assets.List(pluginPath); 
foreach (var pluginAsset in pluginAssets) 
{ 
    var file = Assets.Open(pluginPath + Java.IO.File.Separator + pluginAsset); 

    using (var memStream = new MemoryStream()) 
    { 
     file.CopyTo(memStream); 

     //do something fun. 
     var assembly = System.Reflection.Assembly.Load(memStream.ToArray()); 
     Console.WriteLine(String.Format("Loaded: {0}", assembly.FullName)); 
    } 

} 

在發佈模式中,請注意,Android版Mono將對您的庫執行靜態分析以執行大小優化。如果在此之後加載程序集,則可能沒有應包含的功能。以下屏幕截圖顯示了發佈版本的標準鏈接配置。有一些標誌和配置可以添加到代碼中,以幫助防止鏈接(Xamarin Docs on Linking),但我不確定可以爲動態加載的庫執行的操作太多。

Mono for Android - Release Linking

+0

Thx,它現在可以在調試版本中加載程序集,我可以使用'platformAssembly.CreateInstance',但在發佈版本中,我只獲取錯誤:'模塊中的類不能被裝載'。你是否也遇到過這個問題? – Netbus

+0

Netbus,我在上面更新了我的答案。我相信你遇到的問題是由於發佈版本正在完成的鏈接。嘗試在Properties> Mono Android Options屏幕中關閉鏈接,看看是否仍然出現錯誤。 –

0

這不是直接回答你的問題 - 我沒有關於從資產裝載程序集的想法。

但是,我在mvvmcross中加載插件的確有很多經驗。


在MVX,我們通過簡單地將DLL作爲refernce到UI項目,然後調用Assembly.Load在運行時加載的機器人平臺特定的插件。這似乎運作良好。

此外,同樣的方法可以用於完整的Windows應用程序 - 例如Wpf。但是,在MonoTouch,Wp或WinRt上不能使用相同的方法 - JIT和安全/沙箱限制意味着您必須使用一些ui平臺代碼實際注入代碼引用,而不是使用assembly.load。有關更多信息,請參閱http://slodge.blogspot.co.uk/2012/10/build-new-plugin-for-mvvmcrosss.html?m=1