从android_assets文件夹动态加载dll

当它在资产文件夹中时,是否可以使用Assembly.Load加载一个dll?

我有windows和android平台特定的dll。 我尝试使用android特定的dll作为资产(也在构建操作中),但是当我尝试将其加载到我的应用程序时,它找不到(我使用了path: file:///android_asset/mydll.dll ),并且这只会发生,如果我构建应用程序作为发布,在调试中我获得加载库的必要路径,但不是从资源文件夹。

我能做什么? 还有另一个地方,我可以从我的应用程序加载我的DLL吗?

下面是将程序集写入Plugins文件夹,然后将其读入并在运行时加载的示例。

确保您希望将程序集转到Assets文件夹,并将其设置为AndroidAssetBuild Action 。 见下面的截图。

请注意:您可能需要将扩展​​名更改为.mp3。 看到这里 。 我没有这个问题。

在此处输入图像描述

完成后,您应该可以使用Asset Manager获取资产。 您可以加载它们或对它们执行任何操作。 这是一个将它们读入内存并写出名称的示例。

 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将对您的库执行静态分析以执行大小优化。 如果您在此之后加载程序集,那么您可能没有应该包含的function。 下面的屏幕截图显示了发布版本的标准链接配置。 您可以添加一些标记和配置以帮助防止链接( Xamarin Docs on Linking ),但我不确定您是否可以为动态加载的库做太多。

Mono for Android  - 发布链接

这不是你问题的直接答案 – 我不知道从资产加载程序集。

但是,我确实有很多在mvvmcross中加载插件的经验。


在mvx中,我们通过简单地添加dll作为ui项目的引用然后在运行时调用Assembly.Load来在droid上加载特定于平台的插件。 这似乎运作良好。

此外,相同的方法可以用于完整的Windows应用程序 – 例如Wpf。

但是,同样的方法不能用于MonoTouch,Wp或WinRt – JIT和安全/沙箱限制意味着你必须使用一些ui平台代码来实际注入代码引用而不是使用assembly.load。 有关详细信息,请参阅http://slodge.blogspot.co.uk/2012/10/build-new-plugin-for-mvvmcrosss.html?m=1