在Windows安装程序,全局程序集缓存文件夹中,我有一个我想要注册的DLL。原因是此文件在自定义操作执行期间加载的配置文件中引用。执行自定义操作时,配置仍然无法找到此文件(即使它应该在GAC中)。经过一些审核后,(GACUTIL / l)似乎该文件不在GAC中。我似乎无法弄清楚为什么。该项目何时添加到GAC?自定义操作后?这对我来说似乎不太合理。这个dll也没什么特别之处。它是从项目输出生成的,并且名字很强。
为什么它不能出现在gac中?
由于
答案 0 :(得分:0)
当您的托管自定义操作运行时,程序集尚未在GAC中注册。
根据经验,您的自定义操作程序集永远不应该依赖于它所在的安装包所部署的任何程序集。
围绕该规则有tools provide ways,但大部分都没有。
答案 1 :(得分:0)
Windows Installer使用MsiPublishAssemblies与Fusion API进行交互,以将程序集安装到GAC。问题是Windows Installer支持transact / rollback行为,而Fusion则不支持。因此,Windows Installer会等待安装程序执行的Commit阶段(在InstallFinalize内)将DLL发送到GAC。这会根据程序集(在安装期间需要启动的某些自定义操作和服务)创建事物的竞争条件。
解决此问题的一个好方法是使用WiX DTF来创建托管自定义操作。 DTF的一个功能是获取所有项目内容项和引用,并将它们压缩到您的CA dll中。然后在运行时将它们全部解压缩到临时目录,使您的依赖项可用。现在您的程序集是一个支持文件,而不是实际部署的文件,因此Frederic的评论不适用。