来自Resource.Designer.cs的模棱两可引用智能感知错误

21
我在使用Visual Studio 2017开发时遇到了一个奇怪的bug,一直以来我都能够忽略它,但现在它开始真正地困扰我了。
我将这个问题称为“bug”,而不是“error”,因为我仍然能够在Visual Studio中构建我的项目,并将其部署到我的开发设备上,而构建输出中也没有任何错误或警告。这可能看起来可以暂时忽略,但随着时间的推移,它已经成为一个问题,因为我的智能感知将其标记为红色错误。

a

每次我从Resource类引用属性时,如你所料,我经常引用这个类,Visual Studio编辑器最终会变得杂乱无章,出现这些“错误”,这 (a) 阻碍了我在代码中找到实际错误的能力,(b) 让我感到非常烦恼...
"错误"调查
  • 如最后一张图片所示,智能感知会捕捉到Resource类中每个属性的一个“模棱两可的引用”。当我检查我的Resource.Designer.cs文件时,我只看到了一个引用,但是却收到了第二个错误。

b.

现在它告诉我出现了一个“已声明相同名称成员”的错误。这让我相信可能存在第二个Resource.Designer.cs文件,但我的解决方案资源管理器和Windows资源管理器都只显示一个。

c

尝试的解决方法

  • 将默认命名空间InventoryApp更改为InventoryApp.Resources。这样可以消除错误,但是在构建项目时,它会将文件中的命名空间恢复为默认值,并且错误会再次出现。有人告诉我这是大忌。
  • 删除Resource.Designer.cs文件,从项目中删除"obj"和"bin"文件夹,清理并重建解决方案,然后将新的Resource.Designer.cs文件添加回我的解决方案。这对解决问题没有任何帮助。
  • 从头开始创建一个全新的项目。即使从Visual Studio模板中创建了一个空白的Android应用程序,错误仍然存在。这引出了一个问题:这是Xamarin.Android安装的问题吗?

附注

  • The Resource.Designer.cs file's Build Action is set to "Compile"
  • The .csproj config file contains the tags:

    <AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
    <AndroidResgenClass>Resource</AndroidResgenClass>
    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
    <AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
    <TargetFrameworkVersion>v7.1</TargetFrameworkVersion>
    <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
    <MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
    <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
    

1
您的安装没有问题,这是Visual Studio在Windows和macOS版本中持续存在的问题。有些版本可以修复它,下一个版本又会破坏它(例如,在VS4M 7.6预览版中,它又出现了问题...)。我还没有找到“永久性解决方案”,在developercommunity.visualstudio.com上发布也没有任何结果,至少对我来说是这样...但我很想找到一个“永久性解决方案”... - SushiHangover
@SushiHangover 终于知道我不是唯一遇到这个问题的人了,但同时也很失望地得知我无法解决这个问题。是否有可能将属性放在了默认的Xamarin Android.Resource文件和项目Resource文件中?我知道我能够引用框架中的其他Resource类,这是我能想到的唯一其他可能性。 - ding
1
@dingFAching 要检查歧义是否由 Android.Resource 引起,请检查您的使用中是否有对 Android 的引用,并将其删除(我喜欢完全限定任何使用 Android 命名空间的内容,以避免任何歧义)。不过老实说这只是一个小概率事件;我倾向于支持 SushiHangover,这似乎只是另一个令人烦恼的 Xamarin bug。 - Matthew Andrews
@Betweenmat,我没有明确调用Android指令,只有很多子命名空间,比如App和Widget。当我引用Android.Resource.Layout.activity_main时,编译器告诉我没有定义。所以这肯定不是问题所在。 - ding
1个回答

42

2018年6月6日更新

如果您已经安装了ReSharper,可以忽略下面我所描述的按项目设置解决方案,而是直接安装最新版本(目前是ReSharper 2018.1.2)。显然,根本原因是由先前版本中的错误引起的。升级后,问题得到了解决。

有关更多信息,请参见youtrack.jetbrains.com/issue/RSRP-469636

感谢Xamarin论坛上的@davidbauduin提供此信息。


我相信我已经找出了根本原因并提供了可行的解决方案。

解决方案

在您的.csproj文件的<PropertyGroup>部分中添加以下内容:

<AndroidUseManagedDesignTimeResourceGenerator>False</AndroidUseManagedDesignTimeResourceGenerator>

原因

在之前的 Visual Studio 版本中,该功能默认是关闭的,但最新的 VS2017 更新(15.7.3)已将其打开。该功能会生成第二个 Resources.Designer.cs 文件,导致模糊引用问题。

您可以通过将鼠标悬停在具有 IntelliSense 错误的资源常量上,右键单击并选择“转到定义”,然后选择第一项,即可验证此问题,这将带您进入 Resource.Designer.cs 文件。如果重复此操作,但选择第二个,则会进入不同的 Resource.Designer.cs 文件。其中一个指向 obj\Debug\designtime\Resource.Designer.cs 文件。通过按上述描述将该功能设置为 False,obj\Debug\designtime 路径中的 Resource.Designer.cs 文件将不会生成。

关于 AndroidUseManagedDesignTimeResourceGenerator 功能的信息:

https://developer.xamarin.com/releases/android/xamarin.android_8/xamarin.android_8.1/#design-time-builds-managed-resource-parser

https://github.com/dotnet/project-system/blob/master/docs/design-time-builds.md#design-time-builds

希望这可以帮到您!


1
由于我没有使用Xamarin的设计工具,所以这个解决方案完美地运行。 - nyconing
今天早上我启动电脑时,错误似乎已经解决了... 我大约两天前更新了VS,可能那个更新起了作用。@nyconing,你在使用VS吗? - ding
这也是一个正在调查的错误,将在未来的VS版本中修复:https://developercommunity.visualstudio.com/content/problem/248182/xamarin-resources-indicate-duplicates.html - BigDevJames
VS2019 看起来仍然很相关。谢谢。 - Jammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接