1

我真的在用 WiX 苦苦挣扎。我有 .NET 程序集要安装,需要注册 COM 互操作,并且它们必须向另一个框架注册,该框架需要在 GAC 中的 .NET 程序集中调用 Register() 方法。这种注册方法是一个带有隐藏存储机制的“黑匣子”,因此我无法以声明方式执行此操作。

我知道声明性方法最适合 COM 注册,但是使用 heat.exe 时我有两个问题:

  1. RegAsm 有效,但 Heat.exe 用以下消息阻塞了我的程序集:

    heat.exe:警告 HEAT5151:无法从预期为程序集的文件中收集数据:C:[...].dll。如果此文件不是程序集,您可以忽略此警告。否则,此错误详细信息可能有助于诊断故障:调用的目标已引发异常。

  2. 我需要进行的二次注册依赖于 [ComRegisterFunction] 属性,该属性通常会在为 COM 互操作注册程序集时触发进一步的操作。当程序集由 RegAsm.exe 或通过调用 System.Runtime.InteropServices.RegistrationServices 注册时,通常会发生这种情况。所以,我需要我的程序集中的 ComRegisterFunction 在安装期间执行。

我不介意对 COM 注册采用声明性方法(或者我不介意是否对我的程序集进行加热),但我需要将 ComRegisterFunction 称为安装的一部分。理想情况下,我想查看我正在安装的所有可执行文件,针对具有 [ComRegisterFunction] 属性的任何方法反映它们并调用这些方法,这将在安装所有文件后完成。

如何在 WiX 中实现这一点?或者,还有其他方法吗?如果有什么不同,我将使用“Votive”Visual Studio 与项目引用的集成。

4

2 回答 2

1

这些是相反的目标。使用声明式方法的要点是不要使用 Regasm.exe 或 Regsvr32.exe 来调用注册函数。换句话说,您的 [ComRegisterFunction] 属性方法不会被调用。你不能两者兼得。

heat.exe 死亡的异常不健康,它表明您的注册函数或类构造函数有问题。通过使您的 DLL 成为启动项目来调试它。项目 + 属性,调试选项卡并使 heat.exe 成为启动程序。将命令行设置为您的 DLL。Debug + Exceptions 并勾选 CLR exceptions 的 Throw 框,当抛出异常时调试器将停止。

哦,别忘了在你的注册函数中调用 RegistrationServices.RegisterAssembly。由于您使用了该属性,因此 Regasm.exe 将不再自动执行此操作。

于 2010-10-10T18:20:11.287 回答
0

我会警告我的回答,说明正确的方法是汉斯所说的——通过热量。

然而,另一种方法是在 Component 元素下使用 File 元素的 SelfRegCost 属性。

下面是我们的一个较旧的安装套件的示例,到目前为止,它一直没有出现任何问题。

<File Source="..\..\External References\MSCAL.OCX" SelfRegCost="1"/>

与任何 SO 答案一样,最好检查这是否适用于您的情况并彻底测试。

于 2014-01-24T13:11:13.120 回答