【发布时间】:2017-12-13 04:07:21
【问题描述】:
我正在构建我的第一个 Xamarin Forms 应用程序(我之前构建过一个,但它是一个 Xamarin Android 应用程序)。有一个奇怪的问题会阻止我每次调试我的应用程序。主要的 Xamarin Forms Portable 项目有 2 个来自其他可移植库项目的其他引用。因此,在 Android 项目(只是一个示例)上的每次构建之后,2 个输出 DLL(来自引用的项目)被锁定(由 devenv.exe)。这意味着我不能在保持 VS 打开的同时简单地重建它。在重新打开我的项目并再次构建之前,我必须关闭 VS 并手动删除输出 DLL。这是完全不能接受的。
我发现输出 dll 以某种方式缓存在名为 ProjectAssemblies 的文件夹中,它通常位于 C:\Users[UserAccount]\ AppData\Local\Microsoft\VisualStudio\14.0\ProjectAssemblies(适用于 Visual Studio 2015)。
但这只是我认识的一个奇怪信号,我的意思是这似乎不是真正的问题,因为即使我删除了那里的所有文件,在重新启动 VS 后,输出 dll 仍然以某种方式加载到 devenv.exe(我使用 Process Hacker 找到了这些 dll 并知道它们是由 devenv.exe 加载的)。防止这种情况的唯一方法是删除文件夹 bin 中的输出 dll。但这只能工作一次,如果重建项目我必须重做所有这些步骤(关闭 VS,删除输出 dll,重新打开 VS)。
唯一的最终方法可能是将输出 DLL 添加为引用(而不是项目),但这不允许在引用的项目中轻松调试代码(仍然引用的项目是主要解决方案的一部分,它们不是某种即用型的独立库)。
更新
通过使用 Process Hacker,我知道 Xamarin Forms 项目的一些必要 DLL(例如 Xamarin.Forms.Core.dll)也被加载到 devenv.exe但是它们是从 ProjectAssemblies 中的路径加载的(如前所述)。所以这些 DLL 没有被锁定,它们可以从 bin 文件夹中清除。但不知何故,我的项目 dll 并没有以同样的方式处理。 devenv.exe 中似乎加载了 2 个版本,一个来自 ProjectAssemblies,另一个来自bin 文件夹(特定于平台的项目,而不是主要可移植项目的)。所以这就是为什么它被锁定并且在重建时不能被清除/覆盖。
【问题讨论】:
-
我在 VS2017 和 Xamarin.Forms 项目中遇到了类似的问题。我通过删除所有引用项目和主应用程序项目中的所有 bin 和 obj 文件夹来修复它。关闭 VS,在 Windows 资源管理器或命令提示符下浏览所有引用的项目,删除它们的 bin 和 obj 文件夹。重新启动 VS 并进行完全重建后,我的构建一直有效。这是在 VS2017 上的,所以有点不同,所以不确定 VS2015 是否可以以相同的方式解决。
-
@PedroSilva 感谢您的意见。好吧,实际上我发现只有在构建失败后才会出现问题(例如某些语法错误)。所以一旦发生这种情况,我需要关闭 VS,删除 bin 文件夹中的 dll 并重新打开 VS。但是如果我在构建和调试之前小心避免语法错误,它应该可以正常工作。
标签: visual-studio xamarin dll build xamarin.forms