调试C#自定义安装程序类

Dea*_*ano 27 .net c# installer

我编写了一个安装类,它扩展了Installer并覆盖了afterInstall,但是我得到了一个空指针异常.我怎样才能调试我的课程?

ste*_*hbu 43

对于难以调试的代码段而言非常方便的东西是

System.Diagnostics.Debugger.Break()
Run Code Online (Sandbox Code Playgroud)

将抛出任何已安装的调试器(VStudio,WinDbg,远程调试器等)捕获的断点.

使用它来调试非常棘手的区域,其中常规F5 + Go或"附加到进程"很难或不可能执行,一些示例包括:

  • 短暂的过程
  • 时间敏感的过程
  • 分解产生的子流程
  • 安装
  • 服务停止/开始
  • 分布式系统

  • 没有为我工作,没有先做System.Diagnostics.Debugger.Launch() (9认同)

Tim*_*mex 10

我发现的最好方法是编写单元测试,并从单元测试中新建并初始化安装程序类:

[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());
} }
Run Code Online (Sandbox Code Playgroud)

至少它会更好地利用IDE工具.这对于拥有大量组件的大型安装人员尤其有用.然后,您还可以创建有序单元测试并按顺序运行它们,以在调试或自动构建期间模拟安装程序.

另一个提示是一般的SOLID/GRASS软件原理...以整洁/薄层形式开发,保持您的实际"自定义操作"安装程序逻辑非常简单,而是调用任何特定于您的安装程序的可重用API内容就像我们习惯于UI开发一样.(无论如何,安装程序只是另一个UI.)如果您的目标是在产品的所有安装程序之间共享某种UI体验,那么这一点尤为关键.


Bob*_*nny 10

惊讶没有人真正回答过.将MessageBox.Show("hello")放入自定义操作的Install()成员中.在debug config中构建部署.安装.出现MessageBox时,进入VS IDE,Debug,Attach Process并查找标记为"Managed"的msiexec实例.将调试器附加到msiexec的该实例.现在返回自定义操作的源,并在调用MessageBox.Show()之后立即放置断点.关闭MessageBox,您的断点将被点击,您正在IDE中进行调试!

  • +1:尽管可能值得注意的是确保*显示"显示所有进程"复选框*.另外,一个人可以`GetCurrentProcess`并用`Id`肯定地识别正确的过程.:) (4认同)

BCS*_*BCS 0

构建 VM,安装 Visual Studio,制作其副本(或创建差异虚拟 HDD)并在 VM 下的调试器下运行安装程序。

这就是我会做的(但我不是专家)。