在控制台中调试自定义操作



我有一个编译为.dll的自定义操作项目,我希望能够逐步完成我的自定义操作,我知道该包可以更改为wixsharp.bin但这看起来不是很实用。无论如何,我仍然尝试了这种方法,但它没有达到我的断点。

Wix使用:System.Diagnostics.Debugger.Launch();在调试中启动操作,这似乎不适用于Wixsharp,但它的预期结果是我想要实现的。

我已经看到debug.assert可用于调试,我也看到了#if DEBUG #endif如何正确调试的引用?

[CustomAction]
public static ActionResult CustomAction(Session session)
{
Debug.Assert();
MessageBox.Show("Hello World!" + session[IISSessions.AppPoolName], "External Managed CA");
return ActionResult.Success;
}

不太确定是什么导致了问题,我删除了我的 bin 文件夹,然后运行了一个构建,现在它似乎正在工作。System.Diagnostics.Debugger.Launch()确实正常工作,它需要包含在#if DEBUG中,正如@Stein Åsmul所说。内置 DEBUG 运行输出的.msi后,在安装过程中点击自定义操作时,系统将提示你打开 Visual Studio 实例。

[CustomAction]
public static ActionResult CustomAction(Session session)
{
#if DEBUG
System.Diagnostics.Debugger.Launch();
#endif
MessageBox.Show("Hello World!" + session[IISSessions.AppPoolName], "External Managed CA");
return ActionResult.Success;
}

注意: 我不使用WixSharp,但下面应该是通用的。至少其中的一部分。

调试自定义操作 :我只遵循此过程(因为我通常使用本机代码(:

  1. 编译调试二进制文件并包含在包中。
  2. 显示自定义操作中的消息框。
  3. 使用 Visual Studio 附加到显示对话框的进程。
    • 对于本机非托管代码,可以附加到msiexec.exe,对于托管代码,可以附加到rundll32.exe系统上下文或用户上下文过程,具体取决于自定义操作的运行方式。
    • 对话之后直接在代码中设置断点,并让它命中。
    • 如果您的源代码与包中的调试二进制文件(调试符号(中的内容匹配,这应该可以工作。

操作方法视频 :高级安装程序中有一个视频,显示了大部分过程:调试 C# 自定义操作。非常好。


有关如何将 C#(托管(自定义操作与 WiX 配合使用的分步说明。


这个问题最近出现了很多,最近一次是在这个问题/答案的第 4 节中。

以下是 installsite.org 中有关该主题的一些老化但很好的内容:调试自定义操作


我根据您自己的建议运行了一个测试,以验证它是否也适用于常规的WiX设置(#if 调试使代码仅适用于调试版本(:

#if DEBUG
System.Diagnostics.Debugger.Launch();
#endif

你提到的另一个命令对我也很有效:

Debug.Assert(false);

主要的挑战是确保正确的dll版本进入MSI。如果您没有看到预期的行为,请尝试使用 Orca 或其他 MSI 编辑器工具手动将要运行的 dll 版本(调试或发布(插入到 MSI 中 - 只是为了确保那里有正确的二进制文件。我不知道这是如何在WixSharp中设置的。


消息框:显示来自 C# 自定义操作的消息框:

将项目引用添加到System.Windows.Forms命名空间和系统程序集(换句话说,既是项目引用,又是 using in 代码(:

using System.Windows.Forms;
<..>
[CustomAction]
public static ActionResult TestCustomAction(Session session)
{
MessageBox.Show("Hello from TestCustomAction");
return ActionResult.Success;
}

除了使用 .NET 消息框之外,还可以通过以下方式使用 MSI 的内置 Win32 对话框:Session.Message调用来显示对话框。这可能更适合最终用户对话框。我将仅使用上述方法进行调试。


供参考:调试自定义操作

C++ debugging

  • 毫秒中断环境变量
  • AssertSz(FALSE, "debug CustomActionName.here."(
  • __asm {int 3};
  • 调试中断和__debugbreak

Managed Code(除上述内容外(:

  • MMsiBreak, 更多

一些链接(用于保管(:

  • 如何从Wix托管引导程序或自定义操作中读取某些注册表项?

相关内容

  • 没有找到相关文章

最新更新