24

我试图调试我的自定义操作。我将 Debugger.Break() 放入自定义操作 cs 中。当我构建自定义操作时,它会创建以下文件:

myCustomAction.dll
myCustomAction.CA.dll
myCustomAction.pdb

在 wix 项目中,我在二进制标签(不是 myCustomAction.dll)中引用了 myCustomAction.CA.dll。由于不存在 myCustomAction.CA.pdb 这就是调试不起作用的原因吗?当显示消息框时,我也尝试过使用消息框并附加到进程。但我收到以下消息:找不到或打开 PDB 文件。

我做错了什么?我有 wix 3.5 版本和 Visual Studio 2010。

4

4 回答 4

68

这是帮助我的文章。

只需将以下代码添加到自定义操作的第一行:

System.Diagnostics.Debugger.Launch();

然后只需运行安装程序。当它开始执行您的操作时,将出现弹出窗口,建议启动 Visual Studio 进行调试。

您的参考库是正确的,它必须是*.CA.dll。MessageBox 的方法也可以,但您需要附加到 rundll32 进程。

于 2013-05-18T09:32:51.997 回答
5

使用 DTF 自定义操作,这两种技术是:

1) 在您的自定义操作中放置一个 MessageBox,然后将 Visual Studio 附加到该进程。附加时,查找加载了本机和 CLR 的 rundll32 进程。

2) 将 MsiBreak 环境变量设置为您的入口点的名称并重新启动机器。当调用该自定义操作时,DTF 将调用调试器。

否则,我的一般建议是让您的入口点成为一个非常薄的单板,将可重用的类连接到 MSI。我通常会创建一个独立的类,我可以在控制台应用程序中提供数据并测试所有内容,然后将该类连接到 DTF。我几乎从不需要调试安装程序自定义操作。

否则,我通常知道这是可行的。

于 2013-03-14T13:28:47.117 回答
4

不确定您的问题是什么,但这里有一篇文章,其中包含示例自定义操作和调试方法。它应该按照以下文章中的说明工作:http: //www.advancedinstaller.com/user-guide/qa-c-sharp-ca.html

于 2013-03-14T11:49:33.787 回答
1

这是除了使用

System.Diagnostics.Debugger.Launch();

以一种改进远程系统(如 VM)上的调试的方式。我对用于打包 .CA.dll 的 wix 目标文件进行了一些更改,结果很好。

在第一个创建项目的条件中,我添加了一个检查 %(ReferenceCopyLocalPaths.extension)' == '.pdb' 这样我的大部分依赖项 .pdb 现在都包含在我的 .CA.dll 中,并允许更轻松的调试体验远程系统。

C:\Program Files (x86)\MSBuild\Microsoft\WiX\v3.x\wix.ca.targets

<Target Name="PackCustomAction"
   Inputs="@(IntermediateAssembly);@(Content);$(CustomActionContents)"
   Outputs="$(IntermediateOutputPath)$(TargetCAFileName)">

    <!-- Find all referenced items marked CopyLocal, but exclude non-binary files. -->
    <CreateItem
     Include="@(ReferenceCopyLocalPaths)"
     Condition=" '%(ReferenceCopyLocalPaths.extension)' == '.pdb' or '%(ReferenceCopyLocalPaths.extension)' == '.dll' or '%(ReferenceCopyLocalPaths.extension)' == '.exe'">
      <Output TaskParameter="Include" ItemName="CustomActionReferenceContents"/>
    </CreateItem>
于 2017-03-15T18:39:17.807 回答