4

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

2 回答 2

2

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

调试自定义操作:我只是按照这个过程(因为我通常使用本机代码):

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

操作方法视频 Advanced Installer的视频显示了大部分过程:调试 C# 自定义操作。很好。


关于如何将 C#(托管)自定义操作与 WiX 一起使用的分步说明


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

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


我根据您自己的建议进行了测试,以验证它是否也适用于常规 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):

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

Managed Code(除上述之外):


一些链接(用于保管):

于 2018-10-18T18:04:51.830 回答
2

Not quite sure what was causing the problem, I deleted my bin folder and then ran a build and it now seems to be working. System.Diagnostics.Debugger.Launch() does work correctly it needs to be contained within an #if DEBUG as @Stein Åsmul stated. Once built in DEBUG run the outputed .msi, you will be prompted to open an instance of visual studio when you hit your custom action during install.

   [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;
     }
于 2018-10-19T12:30:09.490 回答