2

好的,这就是场景。

项目 A 有一个为它开发的类库(我们称之为 MyLib)。我发布了带有 MyLib 版本 1 的项目 A(内部项目)。

我开始在项目 B 上进行开发,但将 MyLib 扩展至版本 2,包括对现有类型的一些优化。

如果我将 Mylib 2 发布到项目 A 和项目 B,我将不得不重新编译项目 A 以支持类型更改,是否有人对此有经过尝试且真实的解决方案?

4

7 回答 7

4

您可以尝试程序集重定向并让项目 A 加载更新版本的库。这将要求您将重定向信息添加到运行应用程序的所有机器的配置中,但您不必重新编译。您可以在应用程序配置文件或机器级别执行此操作。

该文章中的一个示例,说明文件的外观:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="myAssembly"
          publicKeyToken="32ab4ba45e0a69a1"
          culture="en-us" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

当然,如果您在新版本中破坏了与原始库的兼容性,这将无法正常工作。

于 2009-07-20T21:33:54.877 回答
3

如果您不喜欢 @Steven 的程序集重定向方向,并且假设您不想重新编译项目 A,您可以私下将不同版本的 MyLib 部署到每个项目。
然后,项目 A 将继续使用版本 1,而项目 B 将使用版本 2。这似乎是您想听到的——而且这样做是微不足道的。将 MyLib dll 放在每个项目的文件夹(或子文件夹)中,每个项目将自动选择相应的本地版本,或者您可以在 GAC 中对其进行强命名,并让每个项目选择您编译的特定版本。
这实际上是默认行为,您不需要做任何复杂的事情来实现这一点。

于 2009-07-26T19:34:08.823 回答
3

给 MyLib 一个强名称并将其安装到 GAC。GAC 可以有同一个程序集的多个版本。这需要给 MyLib 的版本 1(不仅仅是版本 2)一个强名称。

项目 A 想要 MyLib 版本 1 并在 GAC 中找到它。项目 B 想要 MyLib 的第 2 版并在 GAC 中找到它。每个人都很高兴,您不必在使用它们的程序集的相同目录中保留 30 个不同版本的 MyLib 副本,从而重新创建 DLL 地狱。

我知道 AviD 也提到了 GAC,但作为可执行文件私有副本的替代方案。我认为应该避免这种情况。

于 2009-07-29T16:51:58.617 回答
1

我的建议:持续集成。

使用像 CruiseControl.NET 这样的工具,您可以重建每个项目/解决方案,甚至将一个(.dll)的输出上传到 Source COntrol 以供其他项目使用,每次都运行单元测试,这样您可以检查解决方案 A 中使用的项目中的添加/编辑是否不会破坏也使用该项目的解决方案 B。您可以将构建设置为每晚自动或从 CruiseControl.NET 系统托盘应用程序手动触发。

于 2009-07-31T09:06:30.380 回答
0

这是另一种选择,尽管您应该首先认真考虑其他选择。

ProjectA 引用了 MyLib.dll,它恰好是版本 1。

调整 MyLib 项目的输出名称,生成“MyLib.2.dll”。(您也可以创建一个新项目,但这听起来有点矫枉过正。)

重建 MyLib 和 ProjectB。ProjectB 现在将引用 MyLib.2.dll,而 ProjectA 和 MyLib.dll 完全不受影响。

于 2009-07-29T16:58:19.147 回答
0

你的问题很笼统。你想达到什么目的?项目 A 应该使用您的 lib 的版本 2 还是旧版本?

如果 A 应该使用版本 1,那么强命名或私有部署应该可以解决您的问题。但我认为你不应该问这个问题。

如果 A 应该使用版本 2,那么解决方案取决于您的更改。如果程序集的接口没有改变(但只有内部算法),那么 A 应该与 V2 一起工作而无需重新编译。如果界面发生了变化,无论如何都要调整项目A,没有通用的解决方案。

为了使所需的更改保持较小且易于管理,这是一个良好的对象/界面设计的问题。但是,如果没有有关您的对象和所需更改的详细信息,就无法回答如何做到这一点。

于 2009-07-31T12:45:25.383 回答
0

我会把我所有的代码放在一个版本控制中,比如 Subversion(使用分支和标签)并自动化构建过程。我使用FinalBuilder

因为您可以控制库,所以我建议您发布分支模式

于 2009-07-31T13:07:49.867 回答