我真的在用 WiX 苦苦挣扎。我有 .NET 程序集要安装,需要注册 COM 互操作,并且它们必须向另一个框架注册,该框架需要在 GAC 中的 .NET 程序集中调用 Register() 方法。这种注册方法是一个带有隐藏存储机制的“黑匣子”,因此我无法以声明方式执行此操作。
我知道声明性方法最适合 COM 注册,但是使用 heat.exe 时我有两个问题:
RegAsm 有效,但 Heat.exe 用以下消息阻塞了我的程序集:
heat.exe:警告 HEAT5151:无法从预期为程序集的文件中收集数据:C:[...].dll。如果此文件不是程序集,您可以忽略此警告。否则,此错误详细信息可能有助于诊断故障:调用的目标已引发异常。
我需要进行的二次注册依赖于 [ComRegisterFunction] 属性,该属性通常会在为 COM 互操作注册程序集时触发进一步的操作。当程序集由 RegAsm.exe 或通过调用 System.Runtime.InteropServices.RegistrationServices 注册时,通常会发生这种情况。所以,我需要我的程序集中的 ComRegisterFunction 在安装期间执行。
我不介意对 COM 注册采用声明性方法(或者我不介意是否对我的程序集进行加热),但我需要将 ComRegisterFunction 称为安装的一部分。理想情况下,我想查看我正在安装的所有可执行文件,针对具有 [ComRegisterFunction] 属性的任何方法反映它们并调用这些方法,这将在安装所有文件后完成。
如何在 WiX 中实现这一点?或者,还有其他方法吗?如果有什么不同,我将使用“Votive”Visual Studio 与项目引用的集成。