我对 Dotpeek 非常陌生。也许我错过了一些东西,但一切似乎都井井有条:
然而,当我在反编译的 pdb 中遇到断点时,我不断收到此消息:
我能想到的唯一原因是这是微软的专有软件,他们必须有办法阻止人们这样做。是这样吗?如果没有,我怎样才能让它工作?
我已经搜索并找到了类似的帖子,但由于某种原因,解决方案在这里不起作用......
从编译代码 (DLL) 创建源代码是 dotPeek 的一项功能。Visual Studio 没有该功能。
一些工具可以集成到 Visual Studio 中(例如Red Gate Reflector,一个商业工具),但是 AFAIK、dotPeek 直到现在还没有集成到 VS 中。
所以,不,你不能在 Visual Studio 中看到任意 DLL 的源代码。
我们通常不在这里推荐软件,但也许dnSpy有您正在寻找的东西:调试和反编译功能。
根据文档,您可能错过了这一步:
确保“在 Visual Studio 选项中,转到调试 | 常规页面并清除启用仅我的代码复选框。
通过反复试验,我发现即使一切设置正确,使用“New > Function Breakpoint”手动创建断点也并不总是有效。断点在预期时触发,但我像你一样得到“源不可用”。
我的解决方法是找到一种方法来进入我需要的位置,然后正常设置断点(单击 gutter 或 F9)。有时我可以从我自己的代码中执行此操作,有时我必须在库中找到另一种方法,其中手动断点确实有效。
很容易判断手动断点是否可以工作,甚至无需点击它:连接调试器后,使用“New > Function Breakpoint”创建断点后,如果“Language”和“File”正确,它将工作。或者双击断点时,如果它带你到文件,它会起作用。
这是我的断点的比较,一个是通过步进设置的,另一个是手动设置的。一组手动显示没有文件,当点击显示“源不可用”:
当我将这些断点导出到 XML 时,我注意到以下差异:
有效的断点(步入,然后设置):
<LocationType>SourceLocation</LocationType>
...
<FileName>C:\Users\MyUser\AppData\Local\JetBrains\Shared\vAny\DecompilerCache\decompiler\7391115F-C184-4D01-A933-DF771669B14D\0f\2317d014\HttpCacheAttribute.cs</FileName>
...
<BreakpointType>PendingBreakpoint</BreakpointType>
不起作用的断点(手动创建):
<LocationType>NamedLocation</LocationType>
...
<BreakpointType>BoundBreakpoint</BreakpointType>
...
<ModuleName>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\e1238e8c\6a0ff27b\assembly\dl3\a01be3d2\00ba5bf4_8fe7d601\CacheCow.Server.WebApi.dll</ModuleName>