我有一个管理程序集列表的MonoTouch应用程序。我希望开发人员能够尽可能轻松地修改该程序集列表。我希望我可以让他们为应用程序的引用添加一个程序集,然后我可以像这样循环遍历它们:
foreach (AssemblyName assemblyName in this.GetType().GetReferencedAssemblies())
{
Assembly assembly = Assembly.Load(assemblyName);
//Do something with assembly
}
我遇到的问题是,GetReferencedAssemblies()
返回的数组中找不到我没有明确引用的所有程序集,并且应用程序会编译并发出警告Library 'Unreferenced.dll' missing in app bundle, cannot extract content
。
有没有办法强制MonoDevelop或MonoTouch(不知道哪个在这里负责)在References文件夹中构建和加载所有程序集而没有明确引用这些程序集中的某些类型?
答案 0 :(得分:1)
它以编译器功能开头。为了获得 in GetReferencedAssemblies
列表,必须引用程序集。它可以直接(例如,引用显式类型)或间接(例如引用的引用)。如果编译器没有看到对程序集的引用,那么它将不会成为AssemblyRef
元数据的一部分。
之后缺少引用意味着托管链接器(第一个,可选),然后AOT编译器(第二个,设备必需)不会处理和编译程序集。
简单的方法是确保在应用程序中存在对每个程序集中的类型的引用。它是汇编的一行代码 - 但它也很容易忘记。
您可以通过添加预构建步骤(在MonoDevelop中)来自动执行此操作,该步骤将读取程序集(例如,在目录中)并生成您在应用程序中包含的C#文件(例如,部分类)。这样人们就不必记得在构建中添加新程序集。