调试来自.net core 2.0中动态加载程序集的代码

gsh*_*arp 20 .net c# .net-core

我有一个.net核心2.0控制台应用程序,它执行以下操作(简化):

var a = Assembly.Load(Assembly.GetEntryAssembly()
                              .GetReferencedAssemblies()
                              .First(i => i.Name == "MyAssembly"));

var t = a.GetType("MyType");
var i = (MyBaseType)Activator.CreateInstance(t);

i.Execute();
Run Code Online (Sandbox Code Playgroud)

当我通过代码进行调试时,它会MyType.Execute()按预期进行调试.

但是,如果我使用以下代码加载程序集:

var path = new FileInfo(Assembly.GetExecutingAssembly().Location);
var a = Assembly.LoadFile(Path.Combine(path.DirectoryName, "MyAssembly.dll"));
Run Code Online (Sandbox Code Playgroud)

代码仍然有效但我无法MyType.Execute()在调试时介入.

任何想法为什么/什么是错的?

Luk*_*z M 10

这可能是由于应用程序无法找到与MyAssembly程序集关联的PDB文件引起的,如其中一条评论中所述.但是,似乎PDB文件不需要与程序集相同的文件夹以进行调试工作.

为了检查是否加载了符号,请在调用Assembly.LoadFile()并打开模块窗口之后在行中放置一个断点(可以在Visual Studio的Debug\Windows菜单中找到).在此窗口中,MyAssembly在" 符号状态"列中查找装配和验证值.如果缺少PDB是原因,则值将为" 无法找到或打开PDB文件 ".您还可以使用该窗口查看调试器尝试查找符号文件的位置.

调试器在多个位置查找PDB文件,如下所述: 在Visual Studio调试器中指定符号(.pdb)和源文件.

根据该文章,PDB文件的默认位置是:

  1. 在程序集本身内指定的位置(在编译程序集时由链接器放置)
  2. 动态加载的程序集所在的文件夹
  3. 本地符号缓存文件夹
  4. Internet,网络或本地符号服务器

我想在你的情况下,应该考虑提到的第一个或第二个位置.

另一个需要注意的重要事项是PDB必须与程序集完全匹配,因此在重新编译程序集后,还应更新PDB文件以匹配新版本.

如果PDB文件与程序集匹配并位于上述位置之一,则应该能够调试代码.

可能还有其他原因,这与使用.NET Core的事实没有直接关联,但我认为正确的PDB加载可能值得验证.


Ale*_*xan 4

仅检查我的代码选项吗?

在此输入图像描述

仅启用我的代码

仅(“我的代码”),忽略系统代码和其他经过优化或没有调试符号的代码。调试器显示并单步执行用户代码

也许应该取消选中它?