从android_assets文件夹动态加载dll

时间:2013-01-24 12:38:11

标签: c# xamarin.android .net-assembly

是否可以在资产文件夹中加载Assembly.Load的dll?

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

我该怎么办?还有另一个地方,我可以从我的应用程序中加载我的dll吗?

2 个答案:

答案 0 :(得分:4)

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

确保您要将要转到Assets文件夹的程序集设置为 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

答案 1 :(得分:0)

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

但是,我确实有很多在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