我们有一个多项目解决方案。项目之间的引用是作为项目引用而不是程序集引用完成的(正如人们所期望的那样)。这对于我们的部署工作正常,但是会创建特定于版本的运行时依赖项。问题在于我们希望开始创建仅更新已更改的特定dll的热修复程序安装程序。对于我们当前的客户情况,无法更新所有dll。
项目引用上的'Specific Version'属性被禁用,除了切换到程序集引用并使用csproj中的Choose块在基于构建配置的调试/发行版之间进行切换之外,我很难找到解决方法。 / p>
是否有另一种选择允许运行时使用任何版本?
答案 0 :(得分:3)
免费维护
我们采用的方法是将程序集版本设置为固定数字,并且仅在构建时更新文件版本(我们过去一直保持彼此同步)。我们采用这种方法,因为它免维护,并且让我们保留Project的引用。
程序集版本是.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 :(得分:1)
需要维护
如果无法设置固定的Assembly版本,则另一种方法可以是使用File引用。这里的问题是,项目dll的路径将根据活动的构建配置(调试与发布)而变化。为了解决这个问题,您可以根据配置使引用成为条件引用。
主要缺点是您需要手动维护构建顺序。另外,如果添加新项目,则需要记住再次使用这些动态引用。
<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>
如果需要,还可以将“调试”保留为项目参考,这将使您能够看到Visual Studio根据项目参考自动生成的构建顺序。这样您就可以为您的发布配置模拟该顺序。