c# - 获取“类型'SpatialReference'是在未引用的程序集中定义的。” 仅当未选中优化代码时
问题描述
我遇到了一个奇怪的编译错误,我对此完全感到困惑。
当我编译我的项目时,我得到了这个:
“SpatialReference”类型是在未引用的程序集中定义的。您必须添加对程序集“Esri.ArcGISRuntime, Version=10.2.7.0, Culture=neutral, PublicKeyToken=8fc3cc631e44ad86”的引用。
不过,这不是奇怪的部分。只有当我在应用程序的 C# 项目设置中未选中“优化代码”时,我才会得到这个。
当我选中“优化代码”复选框时,它编译得很好,并且应用程序按预期运行。
应用程序中根本没有使用“SpatialReference”类型,并且该特定类型被包装在应用程序引用的另一个程序集中,据我所知,该类型没有从包装代码中泄漏出来。
使用相同包装程序集的其他应用程序将毫无问题地编译,无论优化代码状态如何,并且包装器程序集已使用近 5 年没有问题。
有没有其他人遇到过这个问题?如果是这样,你是如何解决的?
仅供参考,这些应用程序是 WinForms 应用程序。我正在使用 Visual Studio 2019 Enterprise v16.8.1
2020-11-22 更新
从我们的构建机器(受此影响)卸载 16.8 并重新安装 16.7.7 后,它编译得很好。这开始看起来像是 v16.8.x 的问题。
我应该注意以下几点:
- 这些项目是在 .NET 4.7.2 下运行的 Windows 窗体应用程序
- 我的 16.8 个人工作机器无法构建,我们 CI 的 16.8 构建机器失败,但我同事的 16.7.7 机器可以工作。
- 这仅影响 10 个项目中的 1 个项目,所有项目都使用相同的包装器 API 和相同的功能,并且多年来没有对包装器进行任何更改。为什么它只失败一个而不是其他失败是未知的。
我已经用细齿梳浏览了失败项目的 csproj 文件(使用文本编辑器),我没有看到任何不寻常的东西。
解决方案
如果您安装了一些 NuGet 包,请先尝试清除 NuGet 缓存,然后重新安装 NuGet 包Esri.ArcGISRuntime
。
要清除 NuGet 缓存,请转到工具 > 选项 > NuGet 包管理器 > 常规 > 包还原 > 选择“允许 NuGet 下载丢失的包”和“在 Visual Studio 中构建期间自动检查丢失的包”> 然后单击Clear All NuGet Cache(s)
按钮。
要重新安装 NuGet 包,请转到工具 > NuGet 包管理器 > 包管理器控制台 > 在包管理器控制台中输入Update-Package -reinstall
以重新安装 NuGet 包。
之后,请重新启动VS并重建您的项目,检查此问题是否消失。如果此问题仍然存在,请尝试以下步骤进行故障排除:
1)。请关闭每个 VS 实例并转到您的解决方案文件夹,然后重命名(或删除)隐藏.vs
的bin
和obj
文件夹,然后启动 VS 并重建您的解决方案。
2)。请转到此路径:C:\Users\Administrator\AppData\Local\Microsoft\VisualStudio\16.0_XXXX
并重命名(或删除)每个名为“ComponentModelCache”的文件夹。
3)。请暂时禁用任何第三方扩展,从扩展 > 管理扩展 > 已安装 > 禁用并再次测试。
4)。请尝试从 Visual Studio 安装程序 > VS 2019 > 更多 > 修复来修复 Visual Studio 2019。
推荐阅读
- javascript - 在pdfmake中制作子列(一组具有相同标题的列)
- postgresql - 在 PostgreSQL 中使用子查询更新不起作用
- database - 当我的电话被截断时如何清除我的电话?
- .net - 数据表中的更改已保存但在导入行时未应用
- javascript - Bokeh 如何存储日期时间信息
- php - 使用php将字符串转换为数组的问题
- css - java.lang.NoClassDefFoundError: com/sun/javafx/css/converters/EnumConverter
- python - 如何使用 pandas 或 sql 查询基于其他表在现有表中添加列
- c++ - c ++在地图中按值查找
- javascript - 验证提交按钮jQuery的值