首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制台中的WIxsharp调试自定义操作

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

Stack Overflow用户
提问于 2018-10-18 16:13:20
回答 2查看 2K关注 0票数 4

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

Wix使用:System.Diagnostics.Debugger.Launch();启动在调试中的操作,这个文件似乎不适用于wixsharp,但它的预期结果是我正在努力实现的。

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

代码语言:javascript
复制
    [CustomAction]
    public static ActionResult CustomAction(Session session)
    {
        Debug.Assert();
        MessageBox.Show("Hello World!" + session[IISSessions.AppPoolName], "External Managed CA");

        return ActionResult.Success;
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-19 12:30:09

不太清楚是什么导致了这个问题,我删除了bin文件夹,然后运行了一个构建,现在它似乎正在工作。System.Diagnostics.Debugger.Launch()确实正确工作,它需要包含在一个#if DEBUG中,正如@Stein所述。一旦内置调试运行输出的.msi,将提示您在安装期间按下自定义操作时打开visual studio的实例。

代码语言:javascript
复制
   [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;
     }
票数 3
EN

Stack Overflow用户

发布于 2018-10-18 18:04:51

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

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

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

入门视频:有一段来自高级安装程序的视频显示了大部分过程:调试C#自定义操作。非常好。

关于如何将C# (托管)自定义操作与WiX一起使用的逐步描述。

这个问题最近出现了很多,最近出现在本问题/答案,第4节上。

以下是installsite.org调试自定义操作中关于这个主题的一些老化但很好的内容。

我对您自己的建议进行了测试,以验证它是否也适用于常规的WiX设置( #if调试使代码只适用于调试生成):

代码语言:javascript
复制
#if DEBUG
   System.Diagnostics.Debugger.Launch();
#endif

您提到的另一个命令也适用于我:

代码语言:javascript
复制
Debug.Assert(false);

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

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

将项目引用添加到System.Windows.Forms命名空间和系统程序集(即项目引用和代码中的使用):

代码语言:javascript
复制
using System.Windows.Forms;

<..>

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

除了使用.NET消息框之外,还可以通过:调用以显示对话框使用MSI内置的Win32对话框。这可能对最终用户对话框更好。我只会使用上述方法进行调试。

供参考调试自定义操作

C++ debugging

Managed Code (除上述之外):

  • MMsiBreak更多

某些链接(用于安全保存):

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52878332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档