运行时不特定于版本的 Visual Studio 项目引用

3
我们有一个多项目解决方案。项目之间的引用是通过项目引用而不是程序集引用来完成的(正如人们所期望的那样)。这对我们的部署来说很好,但会创建一个特定版本的运行时依赖关系。问题在于,我们想开始创建热修复安装程序,仅更新更改的特定dll。对于我们当前客户的情况,更新所有dll不是一个选项。
项目引用上的“特定版本”属性被禁用了,我很难找到另一种解决方法,除了切换到程序集引用并在csproj中使用Choose块根据构建配置在调试/发布bin之间切换。
是否有其他替代方案可以允许在运行时使用任何版本?

1
应用程序配置文件应该能够将调用从一个版本重定向到另一个版本。你尝试过吗? - Chris Dunaway
@ChrisDunaway 那是个好观点。我们在其他几个方面使用重定向,也可以在这里使用。我还没有验证它是否适用于这种情况,但我认为应该可以。不过,我希望有一些像程序集引用的SpecificVersion=false设置一样有效且无需维护的东西。 - Bill Tarbell
所有程序集都有强名称吗? - Asti
你关注的问题不对,你仍然需要一个能够知道用户安装了哪个版本DLL的魔法八球。IDE或MSBuild中没有内置提供这个预言的功能,你必须自己跟踪。没有什么微妙的地方,忘记递增[AssemblyVersion]是非常基本的失误。一个专用的部署服务器和一个构建工程师推送更新是常见的方法。这使得你的“当前客户情况”完全成为你的问题,而不是他的问题,就像它应该的那样。 - Hans Passant
那有点含糊不清,应该是客户的问题。他们的IT工作人员应该在审查和测试更改后推送更新。如果他们不想要这个工作人员,那么一定要让他们为你们的工作人员付费 :) - Hans Passant
2个回答

4

无需维护

我们采用的方法是将程序集版本设置为固定数字,只在构建时更新文件版本(我们以前会将两者保持同步)。 我们采用这种方法是因为它不需要维护,并允许我们按项目保留引用。

程序集版本是.NET用于查找依赖DLL特定版本的版本。 文件版本是如果通过Windows资源管理器查看文件的属性详细信息将显示什么。

如果你想要修补任何DLL,则需要将所有程序集引用更新为versionSpecific=false并将所有项目设置为具有固定的程序集版本。 如果您只想能够热修复特定项目DLL,则只需要在这些项目上修复程序集版本。 引用项目可以保留任何程序集版本方案。

程序集版本设置在ProjectFolder / Properties / AssemblyInfo.cs中。 现在我们已将其固定为1.0.0.0,并且只在构建时递增文件版本。

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.2.3.45678")]

1

需要维护

如果您无法设置固定的程序集版本,则另一种方法是使用文件引用。问题在于,您的项目dll路径将根据您的活动构建配置(调试 vs 发布)而变化。为了解决这个问题,您可以根据配置条件地进行引用。

主要缺点是您需要手动维护构建序列。此外,如果您添加新项目,则需要记住再次使用这些动态引用。

  <Choose>
    <When Condition="'$(Configuration)'=='Release'">
      <ItemGroup>
        <Reference Include="Your.AssemblyName">
          <HintPath>..\Your.AssemblyName\bin\x86\release\Your.AssemblyName.dll</HintPath>
        </Reference>
      </ItemGroup>
    </When>
    <Otherwise>
      <ItemGroup>
        <Reference Include="Your.AssemblyName">
          <HintPath>..\Your.AssemblyName\bin\x86\debug\Your.AssemblyName.dll</HintPath>
        </Reference>
      </ItemGroup>
    </Otherwise>
  </Choose>

如果需要的话,您也可以将Debug留作项目引用,这样可以让您查看由于项目引用Visual Studio自动生成的构建序列。然后,您就可以在发布配置中模仿该序列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接