1

是的,我已经阅读了警告标签,并且我知道动态加载程序集有点不鼓励。也就是说,我有一个加载程序集的应用程序——它就是这样工作的。它在 Windows 上运行良好。在 Windows CE 上运行良好。我需要它在 Android 上“正常工作”,即使它需要一些按摩。

基本上,该应用程序是一个引擎,用于加载在运行时满足特定接口的插件 DLL(我们将其称为适配器)。在 Windows 下,它甚至可以在任何时候检测到 DLL 的出现并加载它——如果这在 Android 下不起作用,我很好。

我在工作时遇到的问题是让引擎加载它在设计/编译时知道的适配器,但没有将该适配器的名称硬编码到引擎代码中。我可以添加对适配器的引用以使其不被链接,但我真的,真的不想每次都添加 DLL 名称,因为 DLL 会随着不同的部署而变化,而且会导致巨大的头痛。

所以我想如果它被引用,它会进入 APK,我可以使用反射来加载它,如下所示:

var asm = Assembly.Load("TheAdapterName.dll");

初步测试表明,如果我只是在名称中硬编码,这适用于适配器,但我真的非常想避免这种情况。

所以我想也许我可以通过引用进行反思并提取名称,但奇怪的是,当我这样做时,并不是所有的引用都会真正出现。所以我这样做:

var refs = asm.GetReferencedAssemblies().Select(a => a.Name).ToArray();

我得到了一个包含 14 个程序集名称的数组。但是程序集(asm)有16个引用,其中一个是我需要加载的Adapter插件。适配器肯定在那里 - 哎呀我用Assembly.Load上面两行的全名并解决了。

我想,好吧,也许我可以找出我正在运行的文件夹的“路径”,然后在那里查找 DLL 并以这种方式加载。哈。经过几个小时试图找出一种方法来获得在 Debug 和 Release 下工作的路径后,我想出了更多的白发。

Sooooo......关于如何获得我知道在我的 APK 中的 DLL 名称的任何想法,但我不“知道”在构建时的名称(我正在加载它们并查看用于通过反射检测其“适应性”的接口)。

4

1 回答 1

0

如果这些方法对您不起作用,那么我能想到的唯一建议是添加一个预构建步骤,该步骤更新 C# 或资产文件以提供您需要的列表。

显然这是额外的工作,但应该是完全自动化的,并且无论平台发生什么变化都可以保证工作。


顺便说一句,我还使用反射器查看了我的一个 mvx 项目 - 它显示与asm.GetReferencedAssemblies()您的调查报告相同的列表 - 未列出运行时加载的插件。我猜该GetReferencedAssemblies方法仅报告实际用于在 IL 级别导入类型引用的程序集 - 因此,如果您在 csproj 中引用程序集但不导入任何类型,那么它不会将它们列为已编译代码中的引用.

于 2013-02-20T08:18:26.913 回答