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文件的默认位置是:
我想在你的情况下,应该考虑提到的第一个或第二个位置.
另一个需要注意的重要事项是PDB必须与程序集完全匹配,因此在重新编译程序集后,还应更新PDB文件以匹配新版本.
如果PDB文件与程序集匹配并位于上述位置之一,则应该能够调试代码.
可能还有其他原因,这与使用.NET Core的事实没有直接关联,但我认为正确的PDB加载可能值得验证.