C# 在运行时加载程序集时,Visual Studio调试器如何知道源在何处?
考虑以下代码:C# 在运行时加载程序集时,Visual Studio调试器如何知道源在何处?,c#,.net,visual-studio,debugging,.net-assembly,C#,.net,Visual Studio,Debugging,.net Assembly,考虑以下代码: 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] }); }
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 core 1.1应用程序中编译的,args
在.net core的调试输出目录中包含通用hello world的dll路径
当我运行这个程序时,它从dll的内存副本加载程序集,然后调用入口点。VisualStudio似乎成功地认识到这个dll与我在解决方案中打开的hello world项目相同,我可以逐步完成并调试这个调用的程序
当我从程序集的内存副本加载时,VS调试器如何知道在何处查找源代码?答案在本页中:
使用VisualStudio调试器的全部功能(如
断点)附加到进程时,可执行文件必须
匹配本地源代码和符号(即调试器必须是
能够加载正确的符号(.pbd)文件)。默认情况下,此
需要调试生成
,
程序数据库(.pdb)文件(也称为符号文件)映射
在源文件中为类、方法和对象创建的标识符
将其他代码添加到已编译代码中使用的标识符
项目的可执行文件。.pdb文件还映射了中的语句
可执行文件中执行指令的源代码。这个
调试器使用此信息确定
信息:中显示的源文件和行号
Visual Studio IDE和可执行文件中何时停止的位置
您设置了一个断点。符号文件还包含原始符号
源文件的位置,以及(可选)源文件的位置
可以从中检索源文件的服务器
调试器在其中搜索.pdb文件
它首先定位
.pdb
,然后从那里可以定位源文件
它如何定位.pdb
?发件人:
在Visual Studio IDE中调试项目时,调试器知道代码的.pdb和源文件的默认位置
(默认情况下,如果您在计算机上构建了DLL或可执行文件,则链接器会将关联的.pdb文件的完整路径和文件名放置在DLL或可执行文件中。调试器首先检查符号文件是否存在于DLL或可执行文件中指定的位置。这很有帮助,因为您的计算机上编译的代码始终有可用的符号。)
它还将在其他位置搜索
.pdb
s,但当您尝试将程序集与其磁盘上的文件分离时,此位置似乎是最可能的源位置。它首先定位.pdb
,然后从那里可以定位源文件
它如何定位.pdb
?来自:
在Visual Studio IDE中调试项目时,调试器知道代码的.pdb和源文件的默认位置
(默认情况下,如果您在计算机上构建了DLL或可执行文件,则链接器会将关联的.pdb文件的完整路径和文件名放置在DLL或可执行文件中。调试器首先检查符号文件是否存在于DLL或可执行文件中指定的位置。这很有帮助,因为您的计算机上编译的代码始终有可用的符号。)
它还将在其他位置搜索
.pdb
s,但当您尝试将程序集与其磁盘上的文件分离时,此位置似乎是最有可能的源。完全相同,您可以从调试文件夹中的exe运行应用程序,然后转到visual studio并“附加到进程”然后调试。这是因为您是从调试文件夹运行的。与从调试文件夹中的exe运行应用程序,然后转到visual Server完全相同