是否可以在资产文件夹中加载Assembly.Load
的dll?
我有适用于windows和android的平台特定dll。我尝试使用android特定的dll作为资产(也在构建操作中),但当我尝试将其加载到我的应用程序时,它没有找到(我使用path: file:///android_asset/mydll.dll
),这只会发生,如果我构建应用程序作为发布,在调试中我获得了加载库的必要路径,但不是来自资源文件夹。
我该怎么办?还有另一个地方,我可以从我的应用程序中加载我的dll吗?
答案 0 :(得分:4)
以下是将程序集写入Plugins文件夹,然后将其读入并在运行时加载的示例。
确保您要将要转到Assets文件夹的程序集设置为 AndroidAsset的构建操作。见下面的截图。
请注意:您可能需要将扩展名更改为.mp3。见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),但我不确定您是否可以为动态加载的库做太多。
答案 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