我编写了一个安装类,它扩展了Installer并覆盖了afterInstall,但是我得到了一个空指针异常.我怎样才能调试我的课程?
对于难以调试的代码段而言非常方便的东西是
System.Diagnostics.Debugger.Break()
将抛出任何已安装的调试器(VStudio,WinDbg,远程调试器等)捕获的断点.
使用它来调试非常棘手的区域,其中常规F5 + Go或"附加到进程"很难或不可能执行,一些示例包括:
短暂的过程
时间敏感的过程
分解产生的子流程
安装
服务停止/开始
分布式系统
我发现的最好方法是编写单元测试,并从单元测试中新建并初始化安装程序类:
[TestClass] public class InstallerTest { [TestMethod] public void InstallTest() { // substitute with your installer component here DataWarehouseInstall installer = new DataWarehouseInstall(); string assemblyDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string installLogFilePath = Path.Combine(assemblyDirectory, "install.log"); installer.Context = new System.Configuration.Install.InstallContext(installLogFilePath, null); // Refactor to set any parameters for your installer here installer.Context.Parameters.Add("Server", "."); //installer.Context.Parameters.Add("User", ""); //installer.Context.Parameters.Add("Password", ""); installer.Context.Parameters.Add("DatabaseName", "MyDatabaseInstallMsiTest"); //installer.Context.Parameters.Add("DatabasePath", ""); // Our test isn't injecting any save state so we give a default instance for the stateSaver installer.Install(new Hashtable()); } }
至少它会更好地利用IDE工具.这对于拥有大量组件的大型安装人员尤其有用.然后,您还可以创建有序单元测试并按顺序运行它们,以在调试或自动构建期间模拟安装程序.
另一个提示是一般的SOLID/GRASS软件原理...以整洁/薄层形式开发,保持您的实际"自定义操作"安装程序逻辑非常简单,而是调用任何特定于您的安装程序的可重用API内容就像我们习惯于UI开发一样.(无论如何,安装程序只是另一个UI.)如果您的目标是在产品的所有安装程序之间共享某种UI体验,那么这一点尤为关键.
惊讶没有人真正回答过.将MessageBox.Show("hello")放入自定义操作的Install()成员中.在debug config中构建部署.安装.出现MessageBox时,进入VS IDE,Debug,Attach Process并查找标记为"Managed"的msiexec实例.将调试器附加到msiexec的该实例.现在返回自定义操作的源,并在调用MessageBox.Show()之后立即放置断点.关闭MessageBox,您的断点将被点击,您正在IDE中进行调试!