2010-11-04 110 views
0

在Windows安装程序的全局程序集缓存文件夹中,我有一个我想要注册的dll。原因是这个文件在自定义操作执行期间加载的配置文件中被引用。执行自定义操作时,配置仍然无法找到此文件(即使它应该在GAC中)。经过一些审查后,(GACUTIL/l)似乎该文件不在GAC中。我似乎无法弄清楚为什么。此项目何时添加到GAC?自定义操作之后?这对我来说似乎不太合理。这个DLL也没什么特别的。它是从项目输出生成的,并且是强命名的。Windows安装程序,GAC文件夹中的项目未显示在GAC中

为什么不能在gac中显示?

谢谢

回答

0

当您的托管自定义操作运行时,程序集尚未在GAC中注册。

作为一个经验法则,你的自定义操作组件不应该依赖于它驻留在安装包中部署的任何组件。

toolsprovide ways周围的规则,但大多数没有。

+1

问题在于它没有被自定义操作实际引用。已安装的应用程序使用WCF并且库是自定义绑定的一部分。所以当我尝试使用ConfigurationManager遍历配置文件时,它会中断,因为管理器实际上正在加载类型。我想我将不得不回到纯XML遍历使用XMLDocument'来更新文档。 – Beta033 2010-11-04 19:23:19

0

Windows安装程序使用MsiPublishAssemblies与Fusion API交互以将程序集安装到GAC。问题是Windows安装程序支持事务/回滚行为,而Fusion没有。因此,Windows安装程序会一直等到安装程序执行的提交阶段(在InstallFinalize内)将该DLL发送到GAC。这会根据程序集(在安装期间需要启动的某些自定义操作和服务)创建争用条件。

解决此问题的一个好方法是使用WiX DTF来创作您的托管自定义操作。 DTF的一个特点是将所有的项目内容项目和参考文件都压缩到你的CA dll中。然后在运行时将其全部提取到临时目录,使您的依赖关系可用。现在你的程序集是一个支持文件,而不是实际部署的文件,所以Frederic的评论不适用。