【问题标题】:Exception thrown in referenced project?引用项目中抛出异常?
【发布时间】:2011-06-02 05:41:52
【问题描述】:

我有一个包含 2 个项目的 Visual Studio 2010 解决方案:

  1. Core,一个处理功能和数据访问的 C# 类库项目
  2. UI,一个 ASP.NET 4 网站 (.NET Framework 4),它引用 Core,并调用 Core 中的功能。

我的异常处理程序设置在 Global.asax (Application_Error.) 当 UI 中发生异常时,一切正常,我得到文件名、行号等。

Core 中发生的异常情况并非如此。 为此,我得到一个堆栈跟踪,如:

{FillUserCount at offset 2376 in file:line:column <filename unknown>:0:0}

附: Core.dll 和 Core.pdb 位于 UI Bin 文件夹中。 在 Visual Studio -> 工具 -> 选项 -> 调试 -> 未选中“仅启用我的代码”并选中“启用源服务器支持”。

有没有办法获取堆栈帧信息(文件名、类、方法、行号)也用于我引用的项目中发生的错误?

【问题讨论】:

    标签: c# asp.net debugging exception-handling reference


    【解决方案1】:

    使这项工作正常进行的解决方案是创建一个新网站并重新引用 Core 项目。

    不过,Jon Skeet 提到的先决条件保持不变:

    • 项目必须在 Debug 配置中构建,而不是在 Release 中构建
    • 在引用项目时,确保复制 PDB 文件
    • 在代码方面,当检索有关发生的异常的信息并使用 StackTrace 时,请确保创建实例时将第二个参数设置为 true(true 以捕获文件名、行号和列号;否则,错误。)

    这是我最后的工作代码。它可能会帮助其他人:

            Exception ex = Server.GetLastError().GetBaseException();       
    
            StackTrace trace = new StackTrace(ex, true);
            if (trace.FrameCount == 0)
                return;
    
            StackFrame stackFrame = trace.GetFrame(0);
    
            string className, fileName, functionName, message;
            int line = 0;
    
            // if for some reason, filename is being retrieved as null
            if (stackFrame.GetFileName() == null)
            {
                className = ex.TargetSite.ReflectedType.Name;
                fileName = ex.TargetSite.ReflectedType.Name;
                functionName = ex.TargetSite.Name;
                message = ex.Message;
            }
            else
            {
                // Collect data where exception occured
                string[] splitFile = stackFrame.GetFileName().Split('\\');
                className = splitFile[splitFile.Length - 1];
                fileName = stackFrame.GetFileName();
                functionName = stackFrame.GetMethod().Name;
                message = ex.Message;
                line = stackFrame.GetFileLineNumber();
            }
    

    【讨论】:

      【解决方案2】:

      您是如何引用 Core 的?如果您添加了对“Release”DLL 的引用,那就可以解释了……如果您刚刚添加了对 project 的引用并且正在运行带有“Debug " 配置应该没问题。

      【讨论】:

      • 核心是通过项目参考引用的。 Core 和 UI 都在 Debug 模式下运行。查看您的问题后,我尝试使用 2 个项目创建完全相同的结构,一个解决方案,对于新创建的一个,一切正常。我为任何项目构建配置并排比较了这两种解决方案,但一切都完全相同。一种解决方案(基本创建的解决方案)如何按预期工作,而另一种仍未显示文件名、方法、行等?一定有什么我错过了。
      • @Daniel:嗯……奇怪。当您说“在调试模式下运行”时 - 您的意思是您正在构建调试配置吗?这是重要的一点。
      • 是的,我正在调试配置中构建 Core 和 UI。这是错的吗?
      • @Daniel:不,完全正确。应该没问题。检查 PDB 文件是否正在被复制,并且看起来它的大小正确。
      • PDB 确实被正确复制到 UI 的 Bin 文件夹中,并且与 Core/Bin 中的大小完全相同。此外,使用 true 参数初始化堆栈以访问文件名等(StackTrace trace = new StackTrace(ex, true)),但它不起作用。
      猜你喜欢
      • 2020-05-08
      • 1970-01-01
      • 2018-06-18
      • 2021-04-29
      • 2022-01-05
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多