请考虑以下代码:
private static void Main(string[] args)
{
var exe = new MemoryStream(File.ReadAllBytes(args[0]));
var assembly = AssemblyLoadContext.Default.LoadFromStream(exe);
assembly.EntryPoint.Invoke(null, new object[] { new string[0] });
}
该程序是在.net核心1.1应用程序中编译的,args
包含.net核心的通用hello世界的dll路径,在它的调试输出目录中。
当我运行该程序时,它从内存中的dll副本加载程序集,然后调用入口点。 Visual Studio似乎成功地认识到这个dll与我在解决方案中打开的hello world项目相同,我可以逐步调试这个被调用的程序。
当我从程序集的内存中副本加载时,VS Debugger如何知道在哪里找到源?
答案 0 :(得分:2)
首先找到.pdb
,然后从那里找到源文件。
它如何找到.pdb
?来自Specify Symbol (.pdb) and Source Files in the Visual Studio Debugger:
在Visual Studio IDE中调试项目时,调试器会知道代码的.pdb和源文件的默认位置。
...
(默认情况下,如果您在计算机上构建了DLL或可执行文件,则链接器会将相关.pdb文件的完整路径和文件名放在DLL或可执行文件中。调试器首先检查以查看如果符号文件存在于DLL或可执行文件中指定的位置。这很有用,因为您总是有符号可用于您在计算机上编译的代码。)
还有其他地方也会搜索.pdb
,但当您试图将程序集与磁盘上的文件分离时,这个似乎是最可能的来源。
答案 1 :(得分:1)
答案在MSD页面中:
使用Visual Studio调试器的全部功能(如点击 断点)当附加到进程时,可执行文件必须完全正确 匹配您的本地源和符号(也就是说,调试器必须是 能够加载正确的符号(.pbd)文件)。默认情况下,这个 需要调试版本。
Also,
程序数据库(.pdb)文件,也称为符号文件,映射 您在源文件中为类,方法和创建的标识符 编译时使用的标识符的其他代码 项目的可执行文件。 .pdb文件还会映射语句 可执行文件中执行指令的源代码。该 调试器使用此信息来确定两个关键部分 信息:显示在的源文件和行号 Visual Studio IDE和可执行文件中的位置在何时停止 你设置了一个断点。符号文件还包含原始文件 源文件的位置,以及可选的源位置 可以从中检索源文件的服务器。
任何本地符号缓存文件夹。
指定的任何网络,Internet或本地符号服务器和位置,例如Microsoft符号服务器(如果已启用)。