控制台中的 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:我只是按照这个过程(因为我通常使用本机代码):
- 编译调试二进制文件并包含在包中。
- 显示自定义操作的消息框。
- 使用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。这可能更适合最终用户对话。我只会使用上述方法进行调试。
C++ debugging
:
- MsiBreak environment variable
- AssertSz(FALSE, "debug CustomActionName here.")
- __asm {int 3};
- DebugBreak and __debugbreak
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;
}
我有一个编译为 .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:我只是按照这个过程(因为我通常使用本机代码):
- 编译调试二进制文件并包含在包中。
- 显示自定义操作的消息框。
- 使用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。这可能更适合最终用户对话。我只会使用上述方法进行调试。
C++ debugging
:
- MsiBreak environment variable
- AssertSz(FALSE, "debug CustomActionName here.")
- __asm {int 3};
- DebugBreak and __debugbreak
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;
}