1

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

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

我能做些什么?还有其他地方,我可以把我的dll从我的应用程序中加载吗?

4

2 回答 2

4

这是一个将程序集写入插件文件夹然后读入并在运行时加载的示例。

确保你有你想要的程序集去 Assets 文件夹设置为AndroidAsset 的 Build 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));
    }

}

在发布模式下,请注意 Mono for Android 将对您的库执行静态分析以执行大小优化。如果您在此之后加载程序集,那么您可能没有应该包含的功能。下面的屏幕截图显示了发布版本的标准链接配置。您可以将一些标志和配置添加到代码中以帮助防止链接(Xamarin Docs on Linking),但我不确定您可以为动态加载的库做太多事情。

Mono for Android - 发布链接

于 2013-01-24T13:56:41.063 回答
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

于 2013-01-26T11:29:25.350 回答