gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:17:06 27 4
gpt4 key购买 nike

我是一名经验丰富的 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 等。它们都在运行时,但在编译时真的需要它们吗?

最佳答案

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

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

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

关于c# - 编译 Xamarin 应用程序。加载程序集时出现异常。找不到文件异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37684854/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com