2010-10-21 105 views
0

我使用Wix 3.5 Votive(visual studio集成)为某些COM对象创建安装程序。获取Wix Votive注册COM对象

在Votive中,设置项目引用会从该项目中获取二进制文件,并在编译时自动生成Wix源文件。这非常棒,它是干的,意味着我不必不断更新Wix XML。 Votive生成的片段如下所示:

<Fragment> 
    <DirectoryRef Id="INSTALLLOCATION"> 
     <Component Id="cmpBCE83EAB1AAF2230E306A7325EE7EA11" Guid="*"> 
      <File Id="fil61D40E7D1A1D0A60C27CE6960FED2B0B" Source="$(var.My.Assembly.TargetDir)\My.Assembly.dll" /> 
     </Component> 
    </DirectoryRef> 
</Fragment> 

它对源文件,文档和卫星也是如此,我没有使用它们。然而,它没有做的是为COM注册生成注册表实体(该程序集标记为'COM Visible'和'注册COM Interop',但Votive似乎没有处理这种机制。

Votive在幕后调用了Heat.exe来收集所有这些东西,并且在组件上调用Heat时会吐出一个包含<Class .../><RegistryValue .../>条目的文件,这正是COM注册所需要的。足够的话,Heat可以生成这些东西,这样做很简单,并且可以将输出编辑到Wix项目中。但是,这违反了DRY原则,并且需要手动将Wix项目与源代码保持一致。有点切线,我宁愿让Votive/MSBuild自动完成这项工作,每次解决方案都会建立。

我不是任何MSBuild专家,我正在与Wix,Votive和MSBuild进行大规模的学习。我花了几天时间才达到目标。所以,我的问题是:每当解决方案建立时,Votive/MSBuild生成此COM注册东西是否有直接的方法?我预计对于每个引用的项目,如果设置了“Register for COM Interop”选项,那么Votive/MSBuild将为该项目的输出组件生成COM注册内容。有没有人做到这一点,如果是的话,请在我的大脑变成果冻之前,给我一个援助之手!

回答

1

我不相信这些都应该完成,因为它消除了我喜欢在我的安装程序中看到的更改控制/确定性行为。我想知道安装中的每个文件/资源​​都明确地放入安装程序中,并且它不会被魔法浮动。我想明确收集和编写我的COM元数据,以便我知道它是正确的。当您执行“在生成时提取COM”(InstallShield术语)时,进程可能因任何原因而失败,然后最终得到一个看起来不错的安装,并且安装不当,无法正确部署。你可以引用DRY prinicipal,但是在这个领域中,这些规则的应用有点不同。

+0

我完全明白你的观点,但我的方法是由客户的要求决定的,我的情况表明我尽可能简化和尽可能自动化流程,我需要生成一个模板安装项目,它可以很容易复制了许多项目,并由**缺乏经验的爱好者程序员使用**告诉他们手动编辑他们的COM注册将失败Wix的学习曲线非常庞大,我无法对我的“客户”造成这样的影响因此,除非有人提出了更好的解决方案 – 2010-10-22 12:49:59

+0

如果这是一款iPhone,但在Windows上它永远不会发生,您可能有机会安装很复杂,因为底层平台和技术堆栈很复杂。运行安装向导很容易,写一个不是。大多数开发人员讨厌安装,因为它很难和无聊。如果任何人都可以用一个简单的按钮将它抽象出来,它就已经完成了。 – 2010-10-22 23:07:51

+0

我一直拖着踢和尖叫到相同的结论。所以我接受了这个答案。 – 2011-11-09 23:06:23

0

从Wix 3.0(至少)开始看来,如果库在网络驱动器上编译,则无法生成COM互操作元素。在使用.NET 2.0或.NET 4.0进行编译时,我发现了相同的行为。切换回建立一个本地驱动器(例如,C:)这个问题在.NET 2.0和.NET 4.0程序集中消失。

我还没有找到一个很好的解决方法,而不是确保它在本地驱动器上。 :(