2

这或许更像是一个哲学问题。

假设我有一个框架,我决定提供一个 .NET 库,使框架的某些方面的使用更容易。我不希望每个使用该框架的应用程序都在本地携带库的副本,因此我希望它在 GAC 中(即使存在可能暗示的所有维护问题。)

我可以让框架很容易地将库安装到 GAC 中,因此每个应用程序都不必这样做。但是当我创建新版本的库时,我的框架安装程序必须同时携带旧库和新库,以确保升级不会删除某些应用程序可能正在使用的旧库。

但是,如果每个应用程序也将库安装到 GAC,Windows Installer 引用计数就会启动,并且我的框架不再需要担心在升级场景中携带旧库。仅当最后一个 Windows Installer 引用消失时,才会卸载正在使用的库。

显然,每个应用程序在构建应用程序时都可以访问该库,并且可以轻松地将其包含在其安装程序中。

有人对一个与另一个有意见/观点/经验吗?我意识到这不是严格要求的问题类型(因为它会引起讨论),但我认为简短的讨论会很有用。

4

2 回答 2

1

我们也有对多种产品的确切需求,对于我们的框架,我们只使用一个 MSI合并模块,每个产品都引用了该模块。

<Feature ...>
  ...
  <MergeRef Id="FrameworkMergeModule" />
</Feature>
...
<Directory ...>
  <Merge Id="FrameworkMergeModule" SourceFile="..\Tools\Framework.msm" ... />
</Directory>

正如您所说,这种方法没有发现任何问题,引用计数可以完成它的工作。

要让程序集进入 GAC 需要额外的障碍(强大的命名,wix 中的更多工作),但没什么大不了的。如果您使用 GAC 或只是将普通 xcopy 部署到安装目录(通过 wix-fu),则此方法有效

我们(在强烈命名程序集之后)使用的主要痛苦是在深入研究之前没有完全理解 AssemblyVersion 和 AssemblyFileVersion 属性......您真的只想在真正需要时更改 AssemblyVersion,并查看通配符引用构建和/或修订版本以使事情变得更容易(假设您有严格的版本控制策略)

于 2009-05-05T05:41:09.837 回答
0

您的框架的每个新版本都向后兼容吗?您是否曾经弃用组件或更改接口?

假设上述问题为“否”,您可以增加版本,让新库卸载旧版本并安装新版本。然后使用 GAC 策略文件将旧版本映射到新版本。这样,引用旧库的应用程序就不必更改,并将映射到新版本。

这是关于创建策略文件的 SO 问题

发布者政策文件的 MS 文档

以下将强制任何引用 1.0.0.0 的应用程序使用较新的 2.0.0.0。我相信你也可以使用通配符。

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="myAssembly"
                       publicKeyToken="32ab4ba45e0a69a1"
                       culture="en-us" />
                <!-- Redirecting to version 2.0.0.0 of the assembly. -->
                <bindingRedirect oldVersion="1.0.0.0"
                      newVersion="2.0.0.0"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>
于 2009-05-28T02:53:07.660 回答