Ms access 将COM dll安装到GAC时WIX安装失败

Ms access 将COM dll安装到GAC时WIX安装失败,ms-access,com,wix,Ms Access,Com,Wix,我正在创建一个安装程序,它将为我们的Access应用程序使用.NET COM组件。当我将COM dll安装到INSTALLDIR时,它工作正常。我让WIX通过运行heat来完成COM注册,以获取dll和tlb。但是现在我们想将dll安装到GAC,并且INSTALLDIR中只安装tlb文件。我们的目标是不同版本的软件(可以在同一台机器上安装)可以使用相同的COM版本,卸载一个版本的软件后,其他版本仍然可以工作(当我们将dll安装到INSTALLDIR中时,这无法实现,对吗?如果我的方法错误,请纠正

我正在创建一个安装程序,它将为我们的Access应用程序使用.NET COM组件。当我将COM dll安装到INSTALLDIR时,它工作正常。我让WIX通过运行heat来完成COM注册,以获取dll和tlb。但是现在我们想将dll安装到GAC,并且INSTALLDIR中只安装tlb文件。我们的目标是不同版本的软件(可以在同一台机器上安装)可以使用相同的COM版本,卸载一个版本的软件后,其他版本仍然可以工作(当我们将dll安装到INSTALLDIR中时,这无法实现,对吗?如果我的方法错误,请纠正我)

问题来了:为了将它安装到GAC中,我想我应该在dll文件声明中添加一个Assembly=“.net”。但是,在安装过程中,我遇到以下错误: “错误处理程序中遇到问题:自动错误系统找不到指定的文件。”当我在提交阶段调用一个COM方法(我们创建的访问引用)时,即COM注册后。显然我的COM没有成功注册。但我真的不知道为什么会这样。如前所述,我所做的唯一更改是添加此程序集=“.net”。在此之前,COM注册是正常的,我成功地调用了它


任何帮助都将不胜感激。谢谢

这将不起作用,因为GAC用于基于.net的dll,并且不接受COM dll。若要亲自查看,请尝试将dll放入文件夹C:\Windows\assembly,您将收到一个错误,说明它没有程序集清单

您应该做的是保持该特定COM dll的所有安装程序版本的组件GUID相同。这样,windows installer将记录哪些应用程序正在使用它,并且只有在删除最后一个应用程序后才能取消安装。我也会把它放在它自己的安装文件夹中,否则当第一个安装的版本被卸载时,你会得到一个应用程序安装文件夹


另一种选择是将其分离到自己的安装程序中,然后使用引导程序将它们一起安装。

再次感谢。关于COM注册,为了让Windows installer跟踪COM组件,我应该维护相同的Guid,我应该让WIX分配什么?正如您所提到的,COM dll的组件Guid应该始终相同。但是还有一些其他的:我的COM接口类的ClassInterface(我想对于不同的版本我应该保持它们相同)。tlb接口的接口名与前面带有下划线(389;)的dll接口的接口名相同。我应该保持它们不变吗?是的,任何与COM+lib相关的东西都应该保持不变。当您使用heat获取dll时,您可以使用“-gg”开关,这将为您生成所有必需的GUID。是的,我知道-gg开关,这就是为什么我要问的原因:每次运行heat时,它都会生成一个新的GUID,我想这与“保持GUID不变”相反。目前,每当我的安装程序项目构建时,我都在运行heat。我记得有人说过heat应该只运行一次,或者至少静态运行一次,但他们确实创建了MSBuild任务HeatFile,我正在使用它,所以heat将在每次构建安装程序时运行。在这种情况下是否需要生成新的GUID?我正在使用xsl修改GUID,以保持DLL组件的GUID始终不变。所以我也可以对其他guid这样做,但在我看来这听起来不是正确的方式。是的,对于COM dll,我只运行过一次heat,然后将wxs文件保存到我的项目中。在我的情况下,它很少会改变,不值得设置来运行每个构建。我在每个构建中使用heat的唯一用途是定期更改的内容,例如,我们打包了第三方的数据库创建脚本,这些脚本每月发布一次,因此我在每个构建中使用heat生成。