【问题标题】:Compiling Xamarin application. Exception while loading assemblies. File Not Found Exception编译 Xamarin 应用程序。加载程序集时出现异常。找不到文件异常
【发布时间】:2016-06-08 01:25:24
【问题描述】:

我是一位经验丰富的 Windows .NET 开发人员,但我刚刚开始研究 Xamarin 以构建 android。我正在使用 VS 2015。

我在我的 Visual Studio 项目中添加了一个 DLL(我们称之为 MyDll1.dll) MyDll1.dll 对 MyDll2.dll 有一些依赖。

对于 Windows 解决方案,编译器通常不关心是否已将 MyDll2.dll 添加到项目中,因为代码仅引用 MyDll1.dll。

但是,当我尝试在 Xamarin 中编译一个简单的 dll 时,它会出现编译错误。

Exception while loading assemblies: System.IO.FileNotFoundException: Could not load assembly 'MyDll2, Version=2.5.0.0, Culture=neutral, PublicKeyToken='. Perhaps it doesn't exist in the Mono for Android profile?
File name: 'MyDll2.dll'
   at Xamarin.Android.Tuner.DirectoryAssemblyResolver.Resolve(AssemblyNameReference reference, ReaderParameters parameters)
   at Xamarin.Android.Tasks.ResolveAssemblies.AddAssemblyReferences(ICollection`1 assemblies, AssemblyDefinition assembly, Boolean topLevel)
   at Xamarin.Android.Tasks.ResolveAssemblies.Execute() App1        

所以没关系,我可以添加 MyDll2.dll 作为参考,但问题是 Mydll1.dll 依赖于大约 40 个其他 dll。而这 40 个 dll 依赖于其他 dll 等。它们都有运行时,但在编译时真的需要它们吗?

【问题讨论】:

    标签: c# android xamarin visual-studio-2015


    【解决方案1】:

    您需要访问程序集及其引用。

    Xamarin 的编译器正在做的是链接您的程序集,因此它需要实际文件以便提取元数据和 IL。您可以在项目的属性中禁用链接器,但这将导致更大的应用程序包可能能够运行,只要您从不走任何需要 JITted 缺失程序集的代码路径。另外,由于 JITting 仅适用于 Android,因此它可能无法在 iOS 下运行(由于 Apple 关于解释代码的政策,iOS 项目会提前链接)。

    让我们花点时间谈谈 Xamarin 在编译和打包阶段执行的黑魔法。很久以前,MonoTouch/MonoDroid(Xamarin 的技术最初被命名)团队决定消除共享运行时可能产生的复杂性,并将运行时和程序集捆绑到您的应用程序包中.虽然这使应用程序部署变得更加简单,但它具有爆炸式应用程序包大小的负面影响。为了解决这个问题,他们开发了一个非常简洁的功能:一个链接器,它分析您的应用程序引用的程序集中代码的使用情况,并删除任何未使用的代码。在实践中,这会显着减小应用程序的大小,因为包中省略了您从不使用的代码/程序集。但是,为了能够做到这一点,编译器需要掌握程序集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多