WIX自定义操作调试不起作用

时间:2013-03-14 08:44:00

标签: c# wix windows-installer

我尝试调试自定义操作。 我把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 个答案:

答案 0 :(得分:55)

这是帮助我的the article

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

System.Diagnostics.Debugger.Launch();

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

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

答案 1 :(得分:4)

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

1)将MessageBox放入自定义操作中,然后将Visual Studio附加到该进程。附加时,查找带有native和CLR的rundll32进程。

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

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

否则我知道这一点很有效。

答案 2 :(得分:3)

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

答案 3 :(得分: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>