控制台中的 WIxsharp 调试自定义操作

WIxsharp debug custom action in console

我有一个编译为 .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;
    }

N.B!: I don't use WixSharp, but the below should be generic. At least some of it.

Debug Custom Actions:我只是按照这个过程(因为我通常使用本机代码):

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

How-To Video: There is a video from Advanced Installer showing most of the process: Debug C# Custom Actions. Very good.


.


这个问题最近经常出现,最近一次出现在 this question / answer, section 4

这是来自 installsite.org: Debugging Custom Actions.

的关于该主题的一些陈旧但很好的内容

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

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

你提到的另一个命令对我也适用:

Debug.Assert(false);

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


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

添加对 System.Windows.Forms 命名空间和系统程序集的项目引用(换句话说,既是项目引用又是在代码中使用):

using System.Windows.Forms;

<..>

[CustomAction]
public static ActionResult TestCustomAction(Session session)
{
   MessageBox.Show("Hello from TestCustomAction");
   return ActionResult.Success;
}

除了使用 .NET 消息框,您还可以通过以下方式使用 MSI 的内置 Win32 对话框:Session.Message call to show a dialog。这可能更适合最终用户对话。我只会使用上述方法进行调试。


供参考: Debugging Custom Actions

C++ debugging:

Managed Code(除以上之外):


一些链接(为了妥善保管):

不太确定是什么导致了问题,我删除了我的 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;
     }