【问题标题】:Dynamically load dll from android_assets folder从 android_assets 文件夹动态加载 dll
【发布时间】:2013-01-24 12:38:11
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    确保您将要转到 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));
        }
    
    }
    

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

    【讨论】:

    • Thx,它现在可以加载程序集,在调试版本中我可以使用platformAssembly.CreateInstance,但在发布版本中我只收到错误:The classes in the module cannot be loaded。您是否也遇到过这个问题?
    • Netbus,我在上面更新了我的答案。我相信您遇到的问题是由于发布版本正在完成的链接。尝试在“属性”>“Mono Android 选项”屏幕中关闭链接,看看是否仍然出现错误。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多