动态解析没有文件名的程序集

时间:2013-02-20 04:25:27

标签: xamarin.android

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

基本上,应用程序是一个引擎,可以在运行时加载满足特定接口的插件DLL(我们称之为适配器)。在Windows下,它甚至可以在任何时候检测到DLL的外观并加载它 - 如果在Android下无法运行,我会很好。

我遇到的问题是让Engine在设计/编译时加载了一个它知道的适配器,但没有将该适配器的名称硬编码到Engine代码中。我很好地添加了对适配器的引用以使其无法链接,但我真的,真的不希望每次都添加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 ......关于如何获取我知道的DLL名称的任何想法都在我的APK中,但是我不知道“构建时的名称”(我正在加载)他们通过反射寻找接口来检测他们的“适应性”。)

1 个答案:

答案 0 :(得分:0)

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

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


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