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