我有一个编译为.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;
}
不太确定是什么导致了问题,我删除了我的 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;
}
注意: 我不使用WixSharp,但下面应该是通用的。至少其中的一部分。
调试自定义操作 :我只遵循此过程(因为我通常使用本机代码(:
- 编译调试二进制文件并包含在包中。
- 显示自定义操作中的消息框。
- 使用 Visual Studio 附加到显示对话框的进程。
- 对于本机非托管代码,可以附加到
msiexec.exe
,对于托管代码,可以附加到rundll32.exe
。系统上下文或用户上下文过程,具体取决于自定义操作的运行方式。
在 - 对话之后直接在代码中设置断点,并让它命中。
- 如果您的源代码与包中的调试二进制文件(调试符号(中的内容匹配,这应该可以工作。
- 对于本机非托管代码,可以附加到
操作方法视频 :高级安装程序中有一个视频,显示了大部分过程:调试 C# 自定义操作。非常好。
有关如何将 C#(托管(自定义操作与 WiX 配合使用的分步说明。
这个问题最近出现了很多,最近一次是在这个问题/答案的第 4 节中。
以下是 installsite.org 中有关该主题的一些老化但很好的内容:调试自定义操作。
我根据您自己的建议运行了一个测试,以验证它是否也适用于常规的WiX设置(#if 调试使代码仅适用于调试版本(:
#if DEBUG
System.Diagnostics.Debugger.Launch();
#endif
你提到的另一个命令对我也很有效:
Debug.Assert(false);
主要的挑战是确保正确的dll版本进入MSI。如果您没有看到预期的行为,请尝试使用 Orca 或其他 MSI 编辑器工具手动将要运行的 dll 版本(调试或发布(插入到 MSI 中 - 只是为了确保那里有正确的二进制文件。我不知道这是如何在WixSharp中设置的。
消息框:显示来自 C# 自定义操作的消息框:
将项目引用添加到System.Windows.Forms
命名空间和系统程序集(换句话说,既是项目引用,又是 using in 代码(:
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
:
- 毫秒中断环境变量
- AssertSz(FALSE, "debug CustomActionName.here."(
- __asm {int 3};
- 调试中断和__debugbreak
Managed Code
(除上述内容外(:
- MMsiBreak, 更多
一些链接(用于保管(:
- 如何从Wix托管引导程序或自定义操作中读取某些注册表项?