错误:您正在调试 X.dll 的发布版本

100

背景

我有一个ASP.NET MVC应用程序项目和其他各种项目,都在Visual Studio解决方案中。不同的项目使用不同版本的NPoco库,具体如下:

  • MVC项目包含通过NuGet安装的NPoco版本。
  • 其他一些项目包括通过对DLL的引用(而非通过NuGet提供的DLL)安装的(可能是不同的)NPoco版本。
  • 其中一个项目是对NPoco的某个版本进行了一些修改的源代码。

我正在使用Visual Studio 2015 Update 3 14.0.25422.01。

错误

由于某种原因,当我在Visual Studio中使用正常的“启动调试”命令启动此应用程序时,它会启动,但也会产生以下警告:

You are debugging a Release build of NPoco.dll. Using Just My Code with Release builds using compiler optimizations results in a degraded debugging experience (e.g. breakpoints will not be hit).

如果我按继续调试,则所有东西似乎仍然像往常一样工作,包括断点。

这个问题最近才开始出现。

问题

  1. 有人知道上述错误是由什么引起的吗?
  2. 我是否配置有误?
28个回答

93
在“调试”->“选项”->“在模块加载时抑制JIT优化(仅限托管)”下禁用此选项。
先前提交的连接报告: https://connect.microsoft.com/VisualStudio/feedback/details/2116788/flag-optimize-is-passed-to-the-debugger-even-while-the-build-settings-optimize-code-is-not-enabled-on-mvc-c-web-projects-when-using-just-my-code
还要确保所有项目都处于调试模式;优化代码通常是未选中的,就像这个案例一样: Visual Studio 2015项目不再以调试模式运行

60
谢谢。当我开启了 在模块加载时禁用JIT优化 这个设置后,问题就停止发生了。 - Sam
不客气,至少我们知道这确实与调试选项有关。 - Jack Zhai
谢谢 - 你建议的解决方案起作用了! 注意:微软反馈链接无法访问,显示:“页面未找到-您请求的内容无法找到或您没有权限查看它。” - Matt
1
但是这个复选框是什么意思?"继续调试(不再询问)"只是为您勾选它吗?勾选此框会使您失去什么? - MistaGoustan
1
我采纳了Sam的建议,但在阅读了这里的文档后决定再试一次。我发现有一个构建警告,指出某些模块已经被优化,但我已经设置了“启用仅调试我的代码”。然后我将“在模块加载时抑制JIT优化”恢复到其原始值(选中状态),但取消了“启用仅调试我的代码”的选择。现在我能够进行调试了。 - Veverke
显示剩余3条评论

32

"Visual Studio" 项目级别有 "优化代码" 选项。在调试模式下移除该选项。


这在我使用的VS2022旧项目中是这样的,谢谢。 - Honza P.
非常好,这在我的项目中是 VS 2022 的一个新功能。感谢您的提示,但希望它能出现在弹出的对话框中。 - Carter
这是我在Visual Studio 2022上工作数小时后找到的解决方案。 - jon.r

29

我在 Visual Studio 2019 中也遇到了类似的问题,按照以下步骤解决:

调试(Debug) → 选项(Options) → 取消勾选启用"Just my code"选项


很好,它运行得非常顺畅,谢谢... - Sayed Mahmoud
这也在我的情况下有所帮助。 - Rahul Khandelwal

24

我曾遇到类似的问题,通过三次清理解决方案并进行重建,问题得以解决。希望这也能对其他人有所帮助。


18

右键点击您的解决方案,选择属性。

然后,在左侧选择“配置属性”,并在其下选择“配置”。 确保您正在运行的项目的配置为“调试”,而不是“发布”。

如果配置为“发布”,则会出现此错误。


2
这就是它,谢谢! - joegreentea
1
在MV sol配置下拉列表中,将调试模式改为发布模式。 - Badr Bellaj
1
在我的ASP.NET Core项目中,这对我非常完美地起作用了。谢谢。 - ramya

9

我在使用NuGet包时遇到了这个问题。

假设你想要调试来自Project1的代码......

如果你在解决方案(.sln)中的任何项目中引用了Project1的NuGet包,请确保将其删除。不要添加Project1的NuGet包,而是将Project1(.csproj)直接作为参考添加到需要Project1的任何给定项目中。这样,在调试时,您将能够逐步执行代码,而Visual Studio则不会再有“Release”版本的警告。

如果Project1来自另一个解决方案(.sln),您可以右键单击当前解决方案并选择“添加现有项...”选择Project1.csproj。然后进入需要Project1的任何项目=> 右键单击 => 添加 => 引用并选择Project1


Project1(.csproj)直接添加为对任何给定项目的引用 - 这一点应该强调 :) - OfirD

5

我发现当你更新一个Nuget包,这个包依赖于一个已被修改版本的引用项目时,它会将其替换为dll的Nuget版本。

在更新(或添加)Nuget包之后,需要修复此问题。您需要删除对dll(例如NPoco)的引用,然后向具有已修改版本的项目添加项目引用。


1
同样的问题...在添加NuGet包后立即开始。起初重新引用修复没有效果,即使重建也是如此。我不得不重新启动VS。然后它就解决了。@TrtlBoy,感谢你的帮助。 - puddleglum
一个简单的重建解决了我的问题。谢谢@puddleglum。 - Reid
1
此外,如果您从项目中卸载了一个NuGet包并直接向项目添加引用,请确保解决方案中没有其他内容在使用该NuGet包。在我的情况下,还有另一个csproj仍在使用该NuGet包,并且它产生了这个消息。我从所有项目中卸载了NuGet包,并手动重新添加了引用。 - NibblyPig
很棒的答案!在解决方案测试中,直接引用项目而不是NuGet。无需重新启动VS。如果有多个项目引用此项目,则可能会出现问题。但是您也不需要包含多个测试项目。 - Nick Turner

4
在我的情况下,我已经勾选了“优化代码”选项来进行调试配置。请确保在所有项目的所有调试配置中都取消勾选此选项。
请参考以下截图:enter image description here

3

哇,我简直不敢相信我没注意到这个。谢谢。 - d0rf47

3
在我的情况下,一些狡猾的骗子将此放入AssemblyInfo.cs文件中:
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

将其注释掉之后,它开始正常工作。


我很高兴能够帮助到你。我应该提一下,后来我发现这个特定的项目是从我们公司丢失源代码的项目的“发布”版本反编译而来的!因此,在任何被反编译的“发布”程序集中找到它可能是很常见的事情。 - Adam Plocher

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