首页 文章

用于COM Interop的WiX寄存器组件

提问于
浏览
0

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

我认为这种声明方法最适合COM注册,但使用heat.exe时遇到两个问题:

  • RegAsm有效,但是Heat.exe在我的程序集上使用以下消息阻塞:

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

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

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

我怎样才能在WiX中实现这一目标?或者,还有另一种方法吗?如果它有任何区别,我使用'Votive'Visual Studio与项目引用集成 .

2 回答

  • 1

    这些是相反的目标 . 使用声明性方法的关键是不使用Regasm.exe或Regsvr32.exe来调用注册函数 . 换句话说,你的[ComRegisterFunction]归因方法赢了't be called. You can' t .

    heat.exe死的例外是不 Health 的,它表明你的注册函数或类构造函数有问题 . 通过使您的DLL成为启动项目来调试此问题 . Project Properties,Debug选项卡和make heat.exe启动程序 . 将命令行设置为DLL . 调试异常并勾选CLR异常的Thrown框,调试器将在抛出异常时停止 .

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

  • 0

    我会告诉我的答案,说明正确的做法是汉斯说 - 通过热量 .

    但是,另一种方法是在Component元素下使用File元素的SelfRegCost属性 .

    下面是一个我们的旧设置套件的示例,到目前为止一直没有问题 .

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

    与任何SO答案一样,最好在您的情况下检查这是否有效并进行彻底测试 .

相关问题