我正在使用wix3.5votive (visual studio集成)为一些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可见”和“为COM互操作注册”,但Votive似乎没有处理这一问题的机制。
在幕后,Votive调用Heat.exe来获取所有这些内容,并在程序集上调用Heat,生成一个包含一堆<Class .../>和<RegistryValue .../>条目的文件,这正是进行COM注册所需的。因此,毫无疑问,热能可以生成这些东西,并且只需执行一次操作,然后将输出编辑到Wix项目中,就会很简单。但是,这违反了DRY原则,并且需要手动使Wix项目与源代码保持同步。出于一些切题的原因,我更喜欢让Votive/MSBuild在每次构建解决方案时自动执行此操作。
我无论如何都不是MSBuild专家,而且我在学习Wix、Votive和MSBuild的过程中遇到了很大的困难。我花了好几天才走到这一步。所以,我的问题是:有没有一种简单的方法可以让Votive/MSBuild在每次构建解决方案时生成这个COM注册内容?我预计对于每个引用的项目,如果设置了“注册COM互操作”选项,那么Votive/MSBuild将为该项目的输出程序集生成COM注册材料。有没有人做到这一点,如果是的话,你能帮我一把吗,在我的大脑变成果冻之前!
发布于 2010-10-21 23:29:21
我不认为应该这样做,因为这会减少我喜欢在安装程序中看到的更改控制/确定性行为。我想知道安装中的每个文件/资源都是显式地放入安装程序中的,并且它不会像魔法一样漂浮进来。我想显式地获取和创作我的COM元数据,这样我就知道它是正确的。当您执行“构建时提取COM”( InstallShield术语)时,该过程可能会由于各种原因而失败,然后您最终会得到一个看似良好的构建,但其安装并不能正确部署。你可以引用DRY原则,但在这个领域中,规则的应用略有不同。
发布于 2010-12-31 02:46:28
似乎在Wix 3.0 (至少)中,如果库是在网络驱动器上编译的,它就不能生成COM互操作元素。在使用.NET 2.0或.NET 4.0编译时,我发现了同样的行为。切换回构建本地驱动器(例如,C:)对于.NET 2.0和.NET 4.0程序集,此问题将不复存在。
除了确保它在本地驱动器上之外,我还没有找到一个好的解决方法。:(
https://stackoverflow.com/questions/3988853
复制相似问题