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



我们有一个多项目解决方案。项目之间的引用是作为项目引用而不是程序集引用完成的(正如人们所期望的(。这对我们的部署来说很好,但会创建一个特定于版本的运行时依赖项。问题是,我们希望开始创建只更新更改的特定dll的热修复安装程序。对于我们当前的客户情况,更新所有dll不是一个选项。

项目引用上的"特定版本"属性被禁用,除了切换到程序集引用和使用csproj中的Choose块根据构建配置在调试/发布仓之间切换之外,我很难找到其他解决方法。

是否有其他替代方案允许在运行时使用任何版本?

免维护

我们采用的方法是将Assembly版本设置为固定数字,并且在构建时只更新File版本。(我们过去常常保持两者同步(。我们采用了这种方法,因为它是免维护的,并让我们按项目保留我们的参考资料。

程序集版本是.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")]

需要维护

如果无法设置固定的程序集版本,则另一种方法可以是使用文件引用。这里的问题是,您的项目dll的路径将根据您的活动构建配置(调试与发布(而有所不同。为了解决这个问题,你可以让你的引用基于配置是有条件的。

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

<Choose>
<When Condition="'$(Configuration)'=='Release'">
<ItemGroup>
<Reference Include="Your.AssemblyName">
<HintPath>..Your.AssemblyNamebinx86releaseYour.AssemblyName.dll</HintPath>
</Reference>
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<Reference Include="Your.AssemblyName">
<HintPath>..Your.AssemblyNamebinx86debugYour.AssemblyName.dll</HintPath>
</Reference>
</ItemGroup>
</Otherwise>
</Choose>

如果需要,您也可以将Debug保留为项目引用,这将允许您查看visual studio由于项目引用而自动生成的构建序列。然后,您就可以在发布配置中模拟该序列了。

最新更新