【问题标题】:Get the original source code location for an assembly获取程序集的原始源代码位置
【发布时间】:2015-01-03 00:17:41
【问题描述】:

有没有办法通过反射获取程序集的原始源代码位置?

警告,我不是在寻找程序集的当前位置,而是在编译源代码时所在的位置。

例如

Given: myAssembly.dll
   c:\program files\myapp\myAssembly.dll <- I'm NOT looking for this location. This is its current location.
   d:\dev\myapp\main.cs <- this is the location I want; the location were the source code resided when it was compiled

我是从这个开始的,但到目前为止我还没有找到该去哪个兔子洞来获取此信息。

Assembly.GetExecutingAssembly().GetType("myAssembly.Main").<something>

当 .Net 中发生异常时,您通常会看到引发异常的类的名称以及原始源代码文件的完整路径。这就是我所追求的。我意识到可能需要一个 .pdb 符号文件才能获得此位置。

【问题讨论】:

  • 我不了解反射,但您可以使用从 dbghelp.dll 库导出的函数读取 PDB 文件的内容 - 包括这些文件名。

标签: c#


【解决方案1】:

该信息存储在 .PDB 文件中。它有两种基本风格,一种是您从 Debug 构建中获得的完整版本,另一种是您默认从 Release 构建中获得的 stripped。剥离的 .PDB 已删除文件和行号信息。专门用于删除大多数公司认为专有的细节。

Project + Properties,Build 选项卡,Advanced 按钮,Debug Info 设置此项。 “Full”是正常的 Debug 构建设置,“pdb-only”是生成剥离版本的默认 Release 构建设置。

原生版本 DbgHelp api 支持读取 .PDB 文件。 The DIA SDK 为它提供了一个更友好的 COM 包装器以及 C# 的常用选择。 CLR 也使用它,这就是您可以在异常的堆栈跟踪中看到文件+行的方式。

【讨论】:

  • 我的发布版本 pdb:s (pdb-only) 小于调试版本 (full) 但仍然包含文件名和行号。
  • 原始pdb文件存储的信息在dll中。
猜你喜欢
  • 2017-04-14
  • 1970-01-01
  • 2021-12-16
  • 2011-05-04
  • 2018-04-08
  • 2018-11-27
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多