在运行时不是特定于版本的Visual Studio项目参考

时间:2018-07-27 18:16:04

标签: c# .net visual-studio dll

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

项目引用上的'Specific Version'属性被禁用,除了切换到程序集引用并使用csproj中的Choose块在基于构建配置的调试/发行版之间进行切换之外,我很难找到解决方法。 / p>

是否有另一种选择允许运行时使用任何版本?

2 个答案:

答案 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根据项目参考自动生成的构建顺序。这样您就可以为您的发布配置模拟该顺序。