【问题标题】:ASP.NET does not debug when I reference a C++ DLL - breakpoint will not be hit当我引用 C++ DLL 时 ASP.NET 不调试 - 断点不会被命中
【发布时间】:2012-05-10 15:39:24
【问题描述】:

我的 ASP.NET 网页需要 C++ .NET DLL 提供的一些数据。就加载此 DLL 并在其中调用函数而言,一切似乎都运行良好,但现在我的项目似乎已经进入了一种状态,如果我在 .cs 文件中引用 DLL,它实际上并没有调试。

我注释掉了所有引用该 DLL 的代码并从我的项目中删除了该引用,它运行良好。我添加了对 DLL 的引用,它工作正常。我只取消了 DLL 命名空间的 using 语句(在本例中使用 MDnlnkCmdReader;),没有留下引用 DLL 的实际代码,现在,当我点击调试时,我的断点都没有命中。再次注释掉该行,断点再次命中。

当它进入网页似乎可以正确加载但没有断点命中的状态时,如果我切换回源代码并查看断点,它们会显示为带有警告标志的大纲,如果我将鼠标悬停在它们上,然后它说“断点当前不会被命中。源代码与原始版本不同”

我也查看了该错误消息并尝试了通常的解决方案。如果我核对整个 /bin 文件夹,我就会开始收到有关 global.asax 的网络服务器错误消息。这些一直存在,直到我在任何 CPU 模式下构建(通常在 x64 中构建),此时我收到有关 DLL(在 x64 中构建)的“无法加载”消息。当我删除对它的引用时,页面会再次运行。切换回 x64 模式并重新添加引用,我就回到了我开始的地方。重启似乎也无济于事。

你知道这里发生了什么,以及如何摆脱它吗?

【问题讨论】:

  • 附加调试器时,是否正在切换目标代码类型?

标签: asp.net


【解决方案1】:

好的,我想我现在已经弄清楚了。我一直在处理的实际上是两个不同的问题。

第一个问题是 ASP.NET 开发服务器似乎只愿意从项目的 /bin 文件夹中获取其 DLL。如果设置为Any CPU,您的项目将在那里构建,但如果设置为x86x64,则默认为在bin/x86/Debugbin/x64/Debug 中构建。如果您使用默认构建位置设置为 x86x64,则开发服务器仍将尝试从 /bin 文件夹的根目录获取 DLL。

如果您从未将项目构建为Any CPU,或者自上次以来已经清理了/bin 文件夹,那么它根本找不到您的DLL,并且开发服务器将显示错误消息比如“无法加载类型'WebDownlink.Global'。”关于您的Global.asax 文件(其中WebDownlink 是您项目的命名空间)。这意味着它无法加载您的命名空间,这是因为它无法找到您的 DLL,因为它只在 /bin 文件夹的根目录中查找。

如果您已将项目构建为 Any CPU,然后切换到在 x86x64 中构建它,那么您的新构建将位于相应的子目录中,但开发服务器仍会从您的最后Any CPU 构建。不过,Visual Studio 调试器将使用您刚刚构建的文件,因此,如果您在上次 Any CPU 构建后更改了任何内容,您将收到不同的源代码错误,并且调试将无法正常工作。如果您没有更改任何内容,则可以进行调试,但开发服务器仍将运行Any CPU 版本,如果您尝试做任何需要注意的事情,这可能会让您感到困惑。

对此的正确解决方案似乎是将您的x86 模式配置为在/bin 文件夹的根目录中构建而不是/bin/x86/Debug 文件夹。或者可能一开始就不要引用任何非托管 DLL。

这与第二个问题相吻合,即 ASP.NET 开发服务器仅在 32 位模式下运行,而 64 位系统上的 IIS 应用程序池仅在 64 位模式下运行(如果您知道改变其中任何一个的方法,请告诉我)。如果您需要将代码链接到无法构建为Any CPU 的非托管 DLL,则必须考虑到这一点。这就是为什么我只引用上面的x86 - 没有必要改变你的x64 的构建位置,因为开发服务器无论如何都不会运行它。

幸运的是,我有我的代码引用的 DLL 的源代码,并且它不引用任何其他内容,因此我可以轻松地在 32 位和 64 位模式下构建它,以便在开发服务器和完整的 IIS。如果您引用的是无法重建的 32 位 DLL,那么您要么必须在 32 位机器上部署,要么想办法让 IIS 应用程序池以 32 位运行,而我做不到。吨。如果您的 DLL 是 64 位且无法重建,那么您只需在完整的 IIS 上对与它相关的所有代码进行调试。

所以我的解决方案是以 32 位构建我的 DLL,重置引用,然后以 32 位模式构建,输出路径设置为/bin。当我想部署时,我在 64 位中重建 DLL,重置引用,在 64 位中构建项目,然后部署到 IIS。

【讨论】:

    【解决方案2】:

    在调试时打开“模块”窗口并查看“路径”列 - 为您提供的程序集的路径是否与您知道与源代码匹配的程序集匹配?

    ASP.NET 通常将程序集的副本放在“Temporary ASP.NET Files”文件夹中,因此您很可能也需要清除它。

    请注意,您还可以取消勾选“要求源文件与原始版本完全匹配”,只要源代码不远,您就可以进行调试。但是,最好还是解决根本问题(程序集与源不匹配)。

    【讨论】:

    • 模块路径中文件的时间戳有点奇怪。在开发服务器上,模块路径始终是 Windows 目录下的一个文件夹。此文件夹中 dll 的修改日期始终与项目调试文件夹中的日期一致,但 .pdb 文件始终具有较旧的时间戳。这在注释行/断点命中和未注释行/断点未命中条件中都以相同的方式发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2020-06-26
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多