gpt4 book ai didi

c# - VS 项目引用因 GUID 区分大小写而损坏

转载 作者:IT王子 更新时间:2023-10-29 04:22:01 31 4
gpt4 key购买 nike

自从升级到 VS 2015 后,我的团队遇到了一些奇怪的事情,我相信现在 Microsoft 正在解决这些问题。一个非常烦人的问题是我们似乎丢失了项目引用,尤其是在分支之后。我昨天开始处理我们解决方案的一个新分支,结果发现类型无法识别,并且命名空间使用被认为是不必要的(因为它们是针对突然变得无法识别的类型)。

项目中的引用没有显示任何图标表明引用有问题,但为了看看它是否有效,我删除并重新添加了一个项目引用,这导致它的类型再次被识别。

当然,这更新了项目文件,所以我查看进行了哪些更改。无法检测到引用的项目与现在可以检测到的项目之间的唯一区别是 GUID 中的字母字符已从小写更改为大写。例如:

旧的、损坏的引用:

<ProjectReference Include="path/redacted">
<Project>{95d34b2e-2ceb-499e-ab9e-b644b0af710d}</Project>
<Name>Project.Name.Redacted</Name>
</ProjectReference>

新的固定引用:

<ProjectReference Include="path/redacted">
<Project>{95D34B2E-2CEB-499E-AB9E-B644B0AF710D}</Project>
<Name>Project.Name.Redacted</Name>
</ProjectReference>

我正在寻找发生这种情况的原因以及如何修复它,而无需手动删除和重新添加所有地方的引用(并且不必将所有项目文件 GUID 转换为大写)。

我应该注意,这些“损坏的”引用并没有破坏构建,它们只在错误列表中显示为 IntelliSense 错误,而不是构建错误。因此,引用并没有真正损坏,它们只是损坏了 IntelliSense(可以说更糟?!)。

最佳答案

长话短说

Visual Studio 在如何为项目分配 GUID 或如何在项目引用中指定这些 GUID 方面并不完全一致。我能够通过对 ProjectGuid 元素使用带大括号的大写 GUID 和为 Project 元素(在引用中)使用带大括号的小写 GUID 来解决该问题。

背景

我们有一个大型解决方案(60 多个 C# 项目),解决方案重建经常出现问题,因为不正确的构建顺序会导致无法解析尚未构建(但应该构建)的引用项目。 Build Dependencies 和 Build Order 看起来是正确的。 MSBuild 批量构建工作正常,只是从 Visual Studio 重建时出现问题。

将所有项目 GUID 强制为带大括号的大写字母和所有项目引用 GUID 强制为带大括号的小写字母可以解决此问题。这是 通常 Visual Studio 生成这些 GUID 的方式,但并非总是如此。

在一个全新的测试解决方案中做一些调查,结果是:

  1. 为控制台应用程序项目生成的 GUID 是带大括号的大写字母。
  2. 为类库项目生成的 GUID 最初是小写的,没有大括号。
  3. 如果将新项目引用添加到具有小写 GUID 的类库项目,则不仅会添加引用 GUID,还会使用大括号将项目 GUID 转换为大写。
  4. 如果制作类库项目的副本并将其添加到解决方案中,则其 GUID 将替换为使用大写字母和大括号的新项目。 (但如果制作了副本并手动删除了其 GUID,则 Visual Studio 不会将替换 GUID 插入 .csproj 文件。)
  5. 项目引用 GUID 通常使用小写和大括号,但不知何故我们的项目积累了一堆大写 GUID 引用。
  6. .sln 中的 GUID 始终使用大写字母和大括号。

我能够通过将引用 GUID 替换为全部大写或全部小写来修复我们损坏的重建 - 这是关于给 Visual Studio 问题的大写和小写的混合(可能是区分大小写的字符串键在某处的字典中?)由于 Visual Studio 通常添加带有小写 GUID 的引用,这是我选择的选项。

正则表达式搜索和替换

为了解决这个问题,我在文件中使用了基于 Notepad++ 正则表达式的搜索和替换,以强制 .csproj 文件中的所有 ProjectGuid 为带大括号的大写字母(控制台应用程序的默认设置,并且在添加任何项目后将应用 Visual Studio 样式引用项目):

Find what: (<ProjectGuid>)\{?([0-9a-f-]+)\}?(</ProjectGuid>)
Replace with: \1{\U\2}\E\3
Search in: *.csproj

一定要打开正则表达式搜索,关闭匹配大小写。并且不要搜索所有文件,否则您可能会进行不需要的更改,例如在 *.xproj 文件中,如@AspNyc 所述。 (有关使用正则表达式更改大小写的更多信息,请参阅 this answer。)

然后我将所有对项目的引用替换为使用带大括号的小写字母(这是 Visual Studio 通常所做的):

Find what: (<Project>)\{?([0-9a-f-]+)\}?(</Project>)
Replace with: \1{\L\2}\E\3
Search in: *.csproj

进行这些更改后,Visual Studio 解决方案重建现在可以可靠地工作。 (至少在下一次流氓大写引用 GUID 潜入我们的项目之前。)

关于c# - VS 项目引用因 GUID 区分大小写而损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36204515/

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