11

我正在 Visual Studio 2015 中调试 .NET 4.0 应用程序。我的应用程序构建并运行良好,但是当我尝试在调试器下运行时编辑并继续时,无论我进行了哪些更改或在我的主项目中进行了哪些更改,我得到一个对话框,上面写着:

进行了无法编译的编辑。在修复编译器错误之前无法继续执行。

作为我正在谈论的那种变化的一个例子,我尝试以各种方法添加这一行:

Console.WriteLine("foo");

当我查看 Visual Studio 的错误列表窗格时,我只看到一个错误 CS7038,其描述为“无法发出模块' <my app name>'”。没有给出文件名、行号或字符。我的代码中没有波浪形的红色下划线。如果我停止正在运行的应用程序,使用更改进行构建,然后再次运行,一切都会构建并运行得很好。因此,构建时编译器和编辑并继续编译器认为可接受的内容之间似乎存在一些差异。

有谁知道如何获取有关为什么在编辑并继续模式下编译失败的更多信息?我阅读了一些关于附加和调试 VBCSCompiler 进程的内容,所以我尝试了这一点,但即使所有异常类型都设置为在抛出时中断,附加的 VS 也从未中断。

我没有分享任何代码,因为这不是关于我的代码的问题,而是关于找出 Edit and Continue 编译器认为错误的策略的问题,据我所知,编译器错误的来源可能在我的任何地方整个项目。

编辑:

如评论中所述,我能够将调试器附加到 Visual Studio 并在编辑代码后单击“继续”时引发异常时中断。异常是System.NotSupportedException带有以下消息的:“在调试期间不允许更改程序集引用的版本”。它列出了相关程序集的名称,这是我的应用程序使用的一个小型 VB.Net 项目,主要使用 C#。我正在尝试构建一个 MCVE 以提交给 Microsoft,但目前我无法在只有一个 VB 和一个 C# 项目的较小解决方案中重现该问题。

编辑2:

我找到了一种解决方法并自行回答了这个问题,以防其他人遇到这个奇怪的问题,但我为任何可以解释发生了什么的人保留了“已回答”复选标记(为什么编译器认为版本号引用的项目在编辑过程中发生了变化)。

4

3 回答 3

5

我找到了解决该问题的方法,但我不完全了解发生了什么。在编辑和继续编译器所说的程序集版本发生变化的 VB.NET 项目中,有一个名为“AssemblyInfo.vb”的文件。该文件包含以下行:

<Assembly: AssemblyVersion("3.0.*")>

装配版本也可以在项目属性中设置,通过应用程序选项卡中的“装配信息”按钮:

在两个地方设置了 AssemblyVersion 的 VB.NET 项目的 Visual Studio 项目属性的屏幕截图

当我AssemblyVersion从 AssemblyInfo.vb 中删除该行时,我的编辑并继续问题就消失了。起初我以为这是因为 Assembly Information 窗口中的字段被保存到与 AssemblyInfo.vb 不同的文件中,并且两者之间存在一些冲突,但现在我看到 Assembly Information 窗口只是编辑 AssemblyInfo 的便捷方式.vb:如果我删除 AssemblyInfo.vb 中的行,它会在 Assembly Information 窗口中清除。

经过一些更多的实验,似乎版本号中的星号是罪魁祸首。如果我完全指定程序集版本,我的编辑并继续问题就会消失。并且引用的项目必须是 VB.NET 项目。我在 C# 项目中尝试了相同的设置,我可以很好地编辑并继续。

这似乎是一个非常极端的案例,我将向 Microsoft 提交错误报告,但与此同时,我很想知道编译器的实际情况——为什么它会得到两个不同的汇编版本在调试期间确实不需要重新编译的程序集......如果您对正在发生的事情有很好的解释,请将其添加为答案。

编辑这是我提交的错误报告

于 2016-12-29T15:55:11.750 回答
1

这发生在我使用 Visual Studio 2019 的 .net 4.8 应用程序中。

我有一个混合 vb 和 cs 项目,当 vbproj 引用使用通配符运算符“*”指定程序集版本的 csproj 时,就会出现问题。

正如@Wai-Ha-Hee 上面评论的那样,通配符使用当前时间,我相信当 VS 重建应用程序以应用您所做的编辑时,程序集的版本会更改导致错误。

在 assemblyInfo 文件(存在错误的项目)中更改:

[assembly: AssemblyVersion("1.0.*")]

至:

[assembly: AssemblyVersion("1.0.0.0")]

它为我解决了。

要说的重要一点是使用通配符'*'使程序集不确定,这意味着每个构建都会产生不同的程序集。这被认为是不好的做法,因为在相同条件下构建源代码会生成不同的程序集。

在 Visual Studio 2019 中:

具有非 sdk 样式项目文件的新 csproj/vbproj 使用以下命令生成:

<Deterministic>true</Deterministic>

并且带有 Sdk 样式项目文件的新 csproj/vbproj 省略了这一行,但也假定确定性为默认值。

我建议考虑其他方式来对程序集进行版本控制。

有关确定性的更多信息:http:
//blog.paranoidcoding.com/2016/04/05/deterministic-builds-in-roslyn.html
https://reproducible-builds.org/

于 2021-01-20T13:28:13.270 回答
0

我在混合解决方案中的一个 C# 项目是 .NET Framework 2.0(而其他项目 - C# 和 VB.NET - 是 .NET Framework 4)。在我将其更改为 .NET Framework 4 后,它开始工作。

于 2022-02-22T14:13:53.457 回答