我正在使用Burn for MSIs包。我正在使用Votive(Visual Studio)&我自己的定制BA而不是WiXBA。我尝试使用Debugger.Launch()
调试自定义BA。但是当我开始调试时,会出现错误消息。
没有为任何调用堆栈帧加载符号。源代码无法显示
我意识到package.exe链接位于C:\Documents and Settings\user\Local Settings\Temp\{GUID}\
的CustomBA dll。始终更改{GUID}
。因此,每当我运行package.exe时,总是会更改目录。
我认为这是发生错误的原因。
在Visual Studio中,当我使用CustomBA dll启动package.exe时,它位于绝对路径(.../Debug/bin/CustomBA.dll
)。但是在执行package.exe之后,它会链接到Local Settings\Temp\{GUID}
目录。因此,当我们开始调试并附加到CustomBA dll时,CustomBA dll的目录会动态更改并发生No symbols are loaded
错误。
C:\Documents and
Settings\user\Local Settings\Temp\{GUID}\
的dll?我们可以选择路径吗?
对于dll静态?答案 0 :(得分:25)
要调试Bootstrapper应用程序,你需要同一解决方案中的Bundle .wixproj和BA .csproj(或.vcxproj,如果你正在使用本机.dll),Bundle项目应该依赖于BA项目,以便重建正常工作。以下步骤可让您进入代码。
注意:确保不运行Visual Studio提升。如果禁用了UAC,请重新启用它。如果Visual Studio正在升级,这些步骤将无法正常工作。
Set as StartUp Project
。 BA .csproj应该是大胆的。Properties
。Properties
上选择Debug
标签。Debug
标签中,选择标有Start external program
现在,您可以按F5并开始调试。请记住,每次更改BA .csproj时,您还需要确保重建Bundle .wixproj。否则,Bundle将使用您的旧BA启动,调试器将发现新建的BA .pdbs不匹配。
额外功劳:如果您在调试器设置中禁用Just My Code
并下载pdbs.zip和sources.zip以获得匹配的WiX安装版本,您实际上也可以单步执行刻录代码作为你的学士学位,看看一切如何一起工作。
答案 1 :(得分:6)
我在这篇文章中关注了Rob's suggestion,但遗憾的是我无法让它为我工作(Visual Studio 2015,Wix 3.10.3,使用WixWPF管理Bootstrapper应用程序)。没有任何断点被击中。我注意到调试器将自己附加到错误的进程,安装程序有两个正在运行的进程(我猜测BA和Bundle)。当我改变过程时,断点被击中但我的托管BA有代码我想在调试器实际连接之前进行调试
我设法找到一个解决方案,在连接调试器之前应用程序不会启动。我把这个代码放在我的构造函数代码隐藏文件(在DEBUG块中)中,用于我的托管BA ...
public MainWindow()
{
#if DEBUG
// Do not start until debugger attached
while(!System.Diagnostics.Debugger.IsAttached)
{
System.Threading.Thread.Sleep(1000);
}
#endif
InitializeComponent();
InstallData = new InstallerInfo();
}
现在,当我编译我的托管引导程序应用程序(带有Debug)和Bundle并运行它时,在连接到托管引导程序应用程序Tools > Attach to Process > Find your exe in the list
之前,应用程序将无法启动。
答案 2 :(得分:5)
您无法从Visual Studio以调试模式运行自定义BA。
您可以做的是运行生成的exe文件,然后将Visual Studio附加到允许您调试它的进程。 (在菜单中:Tools > Attach to Process > Find your exe in the list
)
答案 3 :(得分:1)
唯一真正有效的是:
protected override void Run()
{
Debugger.Launch();
}
在您的引导程序 UI 应用程序(BootstrapperApplication 后代)中。然后从资源管理器启动构建的 bootstrapper.exe 并在“选择即时调试器”窗口中重用 Visual Studio 实例。 在重新构建之前不要忘记清理解决方案。这有时会阻止正确调试。
PS:当无法找到引导程序 UI 程序集的正确 pdb 时,请选择与引导程序设置相同的架构。混合架构可能会导致调试问题。
干杯
答案 4 :(得分:0)
Rob的解决方案不起作用。 AhmedBM的方法有效,但仍可以进一步简化,以便VS运行WiX引导程序进程,然后立即附加到子进程。
public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package)
{
//kill old ones if any
System.Diagnostics.Process.Start(@"c:\Windows\System32\taskkill.exe", "/F /IM Bootstrapper.exe /T");
System.Threading.Thread.Sleep(1000);
//start new one
System.Diagnostics.Process.Start(@"<solution path>\src\Bootstrapper\bin\Debug\Bootstrapper.exe");
System.Threading.Thread.Sleep(1000);
foreach (Process proc in DTE.Debugger.LocalProcesses)
{
if (proc.Name.ToString().Contains(@".cr\Bootstrapper.exe"))
{
proc.Attach();
return;
}
}
System.Windows.MessageBox.Show("Bootstrapper Process was not found.");
}
唯一的问题是您需要DTE对象。在VS的早期版本中,我们可以使用Macroses。但是在VS 2017中我们没有它们。因此,您可以快速制作简单的VS扩展,并在其中添加运行代码的命令。或使用现有的扩展名,其中一些允许创建自定义命令。
答案 5 :(得分:0)
与上面建议的许多其他答案一样,调试器附加到运行安装程序可执行文件的进程。您将需要手动将调试器附加到在temp文件夹下生成的UI进程,就像许多以前所做的那样。
要允许子进程自动附加而无需提及所有附加代码,请按照以下说明操作: