编译Xamarin应用程序。加载程序集时出现异常。找不到文件异常

时间:2016-06-07 16:42:00

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

我是一位经验丰富的Windows开发人员,但我刚刚开始研究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等。它们都是运行时但是它们在编译时真的需要吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

相关问题