【问题标题】:WIxsharp debug custom action in consoleWIxsharp 在控制台中调试自定义操作
【发布时间】:2018-10-18 16:13:20
【问题描述】:

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

【问题讨论】:

    标签: c# wix windows-installer wixsharp


    【解决方案1】:

    不太确定是什么导致了问题,我删除了我的 bin 文件夹,然后运行了构建,现在它似乎可以工作了。 System.Diagnostics.Debugger.Launch() 确实可以正常工作,正如@Stein Åsmul 所述,它需要包含在#if DEBUG 中。一旦内置 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 项目的 bin 文件夹。
    【解决方案2】:

    注意!:我不使用 WixSharp,但以下应该是通用的。至少有一部分。

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

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

    操作方法视频Advanced Installer 的视频显示了大部分过程:Debug C# Custom Actions。很好。


    A step-by-step description of how to use C# (managed) custom actions with WiX.


    这个问题最近出现了很多,最近一次出现在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 消息框外,您还可以通过 Session.Message call to show a dialog 使用 MSI 的内置 Win32 对话框。这对于最终用户对话可能更好。我只会将上述方法用于调试。


    供参考Debugging Custom Actions

    C++ debugging:

    Managed Code(以上除外):


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

    【讨论】:

    • 感谢您的帮助,一旦找到解决方案,我会查看您的建议并回复。
    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多